一文搞懂Cookie,Session,Token,JWT


HTTP協議是無狀態的,無狀態意味着,服務器無法給不同的客戶端響應不同的信息。這樣一些交互業務就無法支撐了。Cookie應運而生。

Cookie

通過F12開發者工具,先瞅瞅Cookie的顏值

從圖中可以看到Cookie包括這些內容:Name,Value,Domain,Path,Expires / Max-Age,Size,HttpOnly,Secure,SameSite,Priority。

Cookie的傳遞會經歷這4步

  1. Client發送HTTP請求給Server
  2. Server響應,並附帶Set-Cookie的頭部信息
  3. Client保存Cookie,之后請求Server會附帶Cookie的頭部信息
  4. Server從Cookie知道Client是誰了,返回相應的響應

Cookie的英文翻譯是甜品,使用Cookie可以自動填寫用戶名、記住密碼等,是給用戶的一點甜頭。

Server拿到Cookie后,通過什么信息才能判斷是哪個Client呢?服務器的SessionID。

Session

如果把用戶名、密碼等重要隱私都存到客戶端的Cookie中,還是有泄密風險。為了更安全,把機密信息保存到服務器上,這就是Session。Session是服務器上維護的客戶檔案,可以理解為服務器端數據庫中有一張user表,里面存放了客戶端的用戶信息。SessionID就是這張表的主鍵ID。

Cookie中保存SessionID

Session信息存到服務器,必然占用內存。用戶多了以后,開銷必然增大。為了提高效率,需要做分布式,做負載均衡。因為認證的信息保存在內存中,用戶訪問哪台服務器,下次還得訪問相同這台服務器才能拿到授權信息,這就限制了負載均衡的能力。而且SeesionID存在Cookie,還是有暴露的風險,比如CSRF(Cross-Site Request Forgery,跨站請求偽造)。

如何解決這些問題呢?基於Token令牌鑒權。

Token

首先,Token不需要再存儲用戶信息,節約了內存。其次,由於不存儲信息,客戶端訪問不同的服務器也能進行鑒權,增強了擴展能力。然后,Token可以采用不同的加密方式進行簽名,提高了安全性。

Token就是一段字符串

Token傳遞的過程跟Cookie類似,只是傳遞對象變成了Token。用戶使用用戶名、密碼請求服務器后,服務器就生成Token,在響應中返給客戶端,客戶端再次請求時附帶上Token,服務器就用這個Token進行認證鑒權。

Token雖然很好的解決了Session的問題,但仍然不夠完美。服務器在認證Token的時候,仍然需要去數據庫查詢認證信息做校驗。為了不查庫,直接認證,JWT出現了。

JWT

JWT的英文全稱是JSON Web Token。JWT把所有信息都存在自己身上了,包括用戶名密碼、加密信息等,且以JSON對象存儲的。

JWT長相是xxxxx.yyyyy.zzzzz,極具藝術感。包括三部分內容

  • Header

    包括token類型和加密算法(HMAC SHA256 RSA)。

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload

    傳輸內容。

    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
    
  • Signature

    簽名,把header和payload用base64編碼后"."拼接,加鹽secret(服務器私鑰)。

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    

再畫個妝,漂亮

可以到https://jwt.io/#debugger-io這個網址卸妝哦

給Token穿個外套

Authorization: Bearer <token>

這就是我們在請求Header里面看到的內容格式了。

JWT的技術細節我會寫在《Go編程(三) JWT認證》,歡迎關注。

簡要回顧

本文簡單介紹了Cookie、Session、Token、JWT的概念,以及為什么需要這些技術。至於更深入的原理和代碼使用,就請讀者自行研究了哦。至少這篇文章能讓你搞懂,看到不會覺得陌生了。哈哈哈。

參考資料

https://jwt.io/introduction/

jwt-handbook-v0_14_1

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3oz769otufok4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM