v2ex上的討論說得比較明白:[前后端分離, JWT 還是 Oauth2?](https://www.v2ex.com/amp/t/439613/2)
個人總結:
1. jwt 用於頻繁且不敏感的操作
很大程度上 token 的作用就是為了在請求量比較大且多終端復用的情況下,減少登錄和用戶數據查詢操作產生的數據庫壓力,如果每次還需要檢查 token 版本,不如直接用最基本的 session 來實現;修改密碼需要多終端下線的操作,可以通過向終端發送重新登錄的通知來實現,如果擔心之前的 token 沒作廢產生的安全風險,應該把在敏感場景中排除 token 的效力。比如,正常的查詢操作都可以使用 token,是不會觸發重新登錄的操作的,但如果涉及到財產、敏感信息的查詢和操作,都應該進行重新登錄並用 session 維護登錄信息。token 永遠不是安全性高的解決方案。token 也不是為了這種場景存在的。
2. JWT的設計中包含了 expire time,方案是放在 jwt 的 payload 中; token 刷新預留一個 path 就 ok 了,訪問這個 path,提取並驗證用戶信息后發一個新的 token 返回給客戶端;后端禁用在 jwt 的設計中是不能實現的,當然你可以在數據庫里保存 token 並標記,但這違反了 jwt 的設計原則,要真是有這樣的需求,說明你的使用場景不適合 jwt
3. 如果你需要以下功能,JWT不適用
第一:對 token 刷新使用期限
第二:支持 token 失效
4. JWT 的過期和刷新,未看
參考業界主流做法,AWS、Azure 和 Auth0 都是用 JWT 為載體,ID Token + Access Token + Refresh Token 的模式:
https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims
https://auth0.com/docs/tokens
可能參考的文章:
1. https://www.cnblogs.com/EasonJim/p/7824293.html
