cookie,session,token,jwt
基本概念
- 認證
- 證明你是你自己,驗證身份
- 授權
- 使用者授予第三方通路使用者的資源權限
- 小程式,應用等擷取手機上的權限
- 使用者授予第三方通路使用者的資源權限
- 憑證
- 認證,授權,媒介
- 身份證,網站遊客模式,使用者模式的令牌
- 認證,授權,媒介
cookie
http無狀态協定,用戶端與伺服器進行會話,不會保留會話資訊,如果需要跟蹤通路者的身份證資訊,需要将會話狀态進行把儲存,通過維護cookie或者session來做到。
cookie是服務端發送至浏覽器上存在浏覽器内的一小塊資料,在下一次發送時會攜帶。
cookie不可跨域,但在一級域名和二級域名之間允許互相使用。domain屬性。
cookie屬性,鍵值對來存儲内容,domain域名,哪個路徑下生效用path,maxAge失效時間,expires過期時間,secure,加密傳輸(如果true,在https下才有效).httpOnly,無法通過JS腳本讀取Cookie資訊,還是能過通過Application中手動修改資訊,一定程度上防止xss攻擊
session
另一種記錄用戶端和伺服器會話狀态的一種機制。
session基于cookie實作,session是存儲在伺服器端,sessionid是存儲到用戶端的cookie中。
- 流程
- 第一次請求伺服器,伺服器根據送出的資訊建立Session
- 請求傳回将Session的唯一辨別SessionId傳回給浏覽器
- 浏覽器接收到SessionId資訊後,會将該資訊存入Cookie中,同時記錄Cookie此SessionID屬于哪個域名
- 第二次請求伺服器時,檢視該域名下是否存在Cookie,存在Cookie自動也将其資訊發送給伺服器,伺服器從Cookie中找到SessionID,再根據SessionId查找對應的Session資訊,如果沒有就是沒有登陸或者登陸失效,如果找到就可以繼續操作。
差別:
- 大小cookie4kb,session最多一個浏覽器一般是20個,預設不超過1024kb
- 安全性,存在用戶端 一個存在服務端
- 存儲類型,cookie時字元串,Session可以時任意類型
- 有效期,Cookie可以時長時間儲存,Session在浏覽器清除cookie或者Session逾時的情況下都會失效。
Token
通路資源接口API所需要的資源憑證
簡單組成:uid使用者唯一身份辨別,time目前時間戳,sign簽名,token前幾位雜湊演算法壓縮成的十六進制字元串
- 過程:
- 用戶端使用使用者名,密碼登陸
- 伺服器驗證請求,驗證是否成功,将使用者資訊生成token傳回給用戶端
- 用戶端接收到token将其存在本地的cookie或者localstorage中
- 用戶端在每一次請求時,都将token攜帶
- 伺服器接收到請求,驗證用戶端攜帶的token,如果成功就向用戶端傳回請求的資料
- 服務端不需要存token通過解析token的時間來換取session 的存儲空間,減輕伺服器壓力
Refresh Token
- 通過RefreshToken來更新AccessToken,通常RefreshToken的時間長于AccessToken,當AccessToken失效以後,通過RefreshToken來重新擷取新的Token,如果RefreshToken也失效了,使用者隻能重新登陸
差別:
- session服務端狀态化,記錄會話資訊,token令牌,服務端無狀态話,不會存儲會話資訊。
- token更安全,有簽名,防止監聽以及重播攻擊,Session以來鍊路層保證安全
JWT
跨端認證解決方案
授權認證機制
過程:
- 使用者輸入使用者名密碼登陸認證成功,傳回一個JWT
- token儲存本地
- 使用者需要在請求頭Authorization中使用Bearer添加JWT
JWT不使用Cookie,不存在跨域問題,使用者狀态不再存儲在伺服器内容中是無認證機制。JWT是自包含,減少了查詢資料庫的需要。
差別:
- token需要查詢驗證使用者資訊,JWT是Token和Payload加密存儲在用戶端中,伺服器隻需要通過密鑰解密驗證,校驗也是JWT自己實作的,不需要查詢或者減少查詢資料庫
引用參考:https://juejin.cn/post/6844904034181070861#heading-22