JWT當初的設計是為了確保在跨組織間安全互相傳遞資料所存在。 但因為JWT無法確保安全性,後來延伸的JWE,但JWE的標準,定義了很多我們不必要的屬性及命名規範,我在想我們應該是可以學精神就好。
為了避免Token 被偽造,登入時將token寫進Redis,所有Request的驗證都需要經過redis 驗證。
解決方案 | 遇到的問題 |
---|---|
localstorage | XSS安全性、手機無痕不能用、舊版手機不能用 |
local storage 轉存session storage | local storage有相容性問題 |
redux-state-sync | 要跑EA 技術審核流程,先不考慮 |
★ InMemeory | 跨視窗狀態同步時,流程處理有點複雜,但是相容性最好 |
P.S. Cookie 和local Storage 在用戶端都會產生實體檔案,但現在的瀏覽器會加密,是有機會破解,session storage 確實比local storage更安全 ,最好是不落地比較安全。
過去的在線人數統計,是依賴Login Table 的SessionId欄位所計算 ,長度目前只有100字元,標準的JWT的長度多半超過100 字元,db 相關欄位要跟著調整。
Desktop Web 有一個window open 的功能,用來查詢帳戶歷史,對於Angualr app來說是兩個獨立的app,在更新token 時會互搶。
我的做法是子視窗一律不換Token,用Post Message 通知父視窗更新token 並將接下來的Request queue住,直到父視窗 token 換完解鎖,再通知子視窗。 (queue 住後等待超過秒數,透過RX的timeout放掉)
JWT Token 規範中,並沒有明確定義,踢人的邏輯都需要自己去實作
上線後,如果發生問題如果要處理很久,希望快速切換回來,這邊有保留,Session Cookie並存的機制。 這邊是透過讀取config ,並由autofac決定要注入Jwt或Session 邏輯。
if (IsJWTAuthentication) { builder.RegisterType<JWTSessionData>().As<ISessionData>(); builder.RegisterType<JWTAuthenticationBLL>().As<IAuthenticationBLL>(); } else { builder.RegisterType<SessionData>().As<ISessionData>(); builder.RegisterType<AuthenticationBLL>().As<IAuthenticationBLL>(); }
實際上不見得,下列情境可能會造成 Https 不安全
客戶端可能切換網路,手機IP 也會跳動,不適合將Token 綁定IP。 應該也是可以的,這其實也是一個合理的行為,只要ba要同意,只要ip變更就得就登出, 並顯示登出原因