一般來說,比較常用的方案有兩種:Session與JWT
Session-Cookie
這種會話方式我們需要區分為傳統單機Session與分散式Session。
在傳統單機Web應用中,一般使用Tomcat、Jetty等Web容器時,使用者的Session都是由容器(單JVM內有效)管理。瀏覽器使用Cookie中記錄SessionId,容器根據 SessionId判斷使用者是否存在會話Session。分散式與叢集場景下,請求將被負載傳送至不同伺服器,所以在這種場景下就要對Session做共享處理了。
傳統Session儲存架構:
傳統Session儲存架構圖
分散式Session儲存架構:
會話資訊儲存在伺服器端Session物件當中,這種方式在分散式會話場景下比較繁瑣,一般我們用SpringSession做分散式會話,會話資訊一般會選擇第三方中介軟體進行儲存,比如:MongoDB,Redis,Mysql,這三種儲存方式分散式會話框架SpringSession都支援,並提供SpringBoot的整合,我們只需要做相關配置即可。以Redis作為分散式Session儲存服務為例:
<!——第一步:引入依賴——><!——第一步:引入依賴——><!‐‐sessions 依賴‐‐>
<!——第二步:在application。yml配置Redis與Session——>spring: redis: host: 192。168。0。198 port: 6379 session: store‐type: redis
分散式會話搞定,就是這麼簡單!!
分散式Session儲存架構圖
JWT
全稱JSON Web Token,
使用者會話資訊儲存在客戶端瀏覽器,
它定義了一種緊湊且自包含的方式,用於在各方之間以JSON物件進行安全傳輸資訊。這些資訊可以透過對稱或非對稱方式進行簽名,防止資訊被串改。
由此可知JWT是:
是JSON格式的資料;
是一個Token,也就是一個令牌方式;
JWT資料包含三部分:
Header
Payload
Signature
示例:
組合方式:Header。Payload。SignatureeyJhbGciOiJIUzUxMiJ9。eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZX hwIjoxNTc3NzgwOTQ5fQ。qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIwHeader:描JWT元資料{ alg: “HS256”, // 表示簽名的演算法,預設演算法為HS256,可以自行別的演算法。 type: “JWT” // 表示這個令牌的型別,JWT令牌就為JWT。}Header = Base64(上方的json資料)Payload:{ “userId”: “lan”, // 使用者ID “exp”: 1489079981393 // 最近更新時間}Payload = Base64(上方的json資料)Signature = HMACSHA256( base64UrlEncode(Header) + “。” + base64UrlEncode(Payload),secret)// secret為加密的金鑰,金鑰存在服務端
JWT使用方式:
通常我們把Token設定在Request‐Header頭中,每次請求前都在請求頭加上下方配置
Authorization: Bearer
示例:Bearer eyJhbGciOiJIUzUxMiJ9。eyJzdWIiOiJ0ZXN0IiwiY3JlYXRlZCI6MTU3NzE3NjE0OTQ3OCwiZXhwIjoxNTc3NzgwOTQ5fQ。qSlhJNpom2XeeqMyXST2AdHvAjztWqR4zvQQEc‐K8qMsJ3XQpwpQsnG7tK06YoYrjcnH5NW2EGjtemIc_00VIw
JWT身份認證流程:
使用者提供使用者名稱和密碼登入
伺服器校驗使用者是否正確,如正確,返回Token給客戶端,此Token可以包含使用者資訊
客戶端儲存Token,可以儲存在Cookie或Local Storage中
客戶端再次請求時,在請求頭中帶上這個Token
伺服器判斷是否存在Token,並且解碼後可以知道是哪個使用者
JWT身份認證流程圖