動態

詳情 返回 返回

淺談Cookie、Session、Token、JWT - 動態 詳情

什麼是認證?
簡單明瞭的來説就是告知服務器你是誰(你的名字、性別...)
互聯網中的認證:
用户名密碼登錄
郵箱發送登錄鏈接
手機號接收短信驗證碼
什麼是授權?
簡單明瞭來説就是管理員賦予用户訪問的權限
例如:手機下載新的app使用時會讓你賦予它讀取相關信息的權限,這就是授權
實現授權的方式有:cookie、session、token、OAuth
什麼是憑證?
憑證就是向服務器證明你自己本人而不是假冒的,類似於身份證或者户口本
Cookie是什麼?
HTTP 是無狀態的協議(對於事務處理沒有記憶能力,每次客户端和服務端會話完成時,服務端不會保存任何會話信息):每個請求都是完全獨立的,服務端無法確認當前訪問者的身份信息。所以服務器與瀏覽器為了進行會話跟蹤(知道是誰在訪問我),就必須主動的去維護一個狀態,這個狀態用於告知服務端前後兩個請求是否來自同一瀏覽器。而這個狀態需要通過 cookie 或者 session 去實現。每個 Web 站點能設置的 Cookie 總數不能超過 20 個
cookie 存儲在客户端: cookie 是服務器發送到用户瀏覽器並保存在本地的一小塊數據(不超過4KB)。
cookie 是不可跨域的: 每個 cookie 都會綁定單一的域名,一級域名和二級域名之間是允許共享使用的(靠的是 domain)。
cookie時效性:目前有些 Cookie 是臨時的,有些則是持續存在的。臨時的 Cookie 只在瀏覽器上保存一段規定的時間(一般是30分鐘),一旦超過規定的時間,該 Cookie 就會被清除
Session是什麼?
在計算機中,尤其是在⽹絡應用中,稱為“會話控制”。
Session是一種HTTP存儲機制是有狀態的協議,目的是為無狀態的HTTP提供的持久機制。所謂Session認證只是簡單的把User信息存儲到Session裏,因為SID的不可預測性,暫且認為是安全的。這是一種認證手段。
Session是基於Cookie實現的,要記住session是存儲在服務器的但是sessionID是存儲在瀏覽器的cookie上的
SessionID 是連接 Cookie 和 Session 的一道橋樑
Token是什麼?
token就是發送請求的憑證,他是怎麼實現的呢?可以將它看作是一串加密的字符串,當用户第一次登錄成功時服務器會生成一串由uid(用户唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token 的前幾位以哈希算法壓縮成的一定長度的十六進制字符串)組成的字符串返回給前端,前端再發送每一次請求時將這一字符串帶到請求頭中,然後服務器會從數據庫中查詢此token是否合法並做出相應的響應。
值得一提的是每次請求都會去校驗此token的合法性想想如果用户多了請求量變大那麼一直操作庫會給庫帶來非常大的壓力。
那麼如何解決呢?
可以將每次生成的toekn存儲在redis中並設置好過期時間(這是一個解決辦法但是也不太好,數據量大了也會造成壓力),當然還有幾個好的解決方法不過都是存儲在緩存中,大同小異這裏就不再一一敍説
JWT是什麼?
Json Web Token 簡稱JWT 目前最流行的跨域認證解決方案
JWT也是一串字符串,中間用點(.)分隔成三個部分,
分別是:

Header(頭部)
Payload(負載)
Signature(簽名)

寫成一行就是下面這樣
Header.Payload.Signature

接下來分別介紹着三個部分

Header: {"alg": "HS256","typ": "JWT"} 其中 alg:表示使用的算法默認是HS256 ,typ:表示token類型  然後再用Base64URL 算法進行機密生成一串字符串

Payload: 也是一個 JSON 對象,用來存放實際需要傳遞的數據。JWT 規定了7個官方字段,供選用。
{
  iss (issuer):簽發人
  exp (expiration time):過期時間
  sub (subject):主題
  aud (audience):受眾
  nbf (Not Before):生效時間
  iat (Issued At):簽發時間
  jti (JWT ID):編號
}
當然也可以在這一部分存儲自己定義的端
Signature:這一部分就是 base64UrlEncode(header)+ base64UrlEncode(palyoad)+密鑰使用alg的算法進行加密

這三者在拼接成一個字符串就是jwt

JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/?token=xxx)。Base64 有三個字符+、/和=,在 URL 裏面有特殊含義,所以要被替換掉:=被省略、+替換成-,/替換成_ 。這就是 Base64URL 算法。
JWT的特點
(1)JWT 默認是不加密,但也是可以加密的。生成原始 Token 以後,可以用密鑰再加密一次。

(2)JWT 不加密的情況下,不能將秘密數據寫入 JWT。

(3)JWT 不僅可以用於認證,也可以用於交換信息。有效使用 JWT,可以降低服務器查詢數據庫的次數。

(4)JWT 的最大缺點是,由於服務器不保存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是説,一旦 JWT 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。

(5)JWT 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT 的有效期應該設置得比較短。對於一些比較重要的權限,使用時應該再次對用户進行認證。

(6)為了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。

到這裏就介紹完了,有收穫的小夥伴點個讚唄!

本文jwt相關部分借鑑於http://www.ruanyifeng.com/blo...

Add a new 評論

Some HTML is okay.