一(yī)、什麽是 cookie
HTTP 是無狀态的協議:每個請求都是完全獨立的,服務端無法确認當前訪問者的身份信息,無法分(fēn)辨上一(yī)次的請求發送者和這一(yī)次請求的發送者是不是同一(yī)個客戶端。服務器與浏覽器爲了進行會話(huà)跟蹤,就必須主動的去(qù)維護一(yī)個狀态,這個狀态用于告訴服務端前後兩個請求是否來自同一(yī)個浏覽器。這個狀态就需要通過 cookie 或者 session 來實現。
cookie 存儲在客戶端:cookie 是服務器發送到用戶浏覽器,并進行保存到本地的數據,它會在浏覽器下(xià)次向同一(yī)服務器再發起請求時被再一(yī)次被帶到并發送到服務器上面
cookie 是不可跨域名的:每個 cookie 都會綁定單一(yī)的域名,無法在别的域名下(xià)獲取使用
二、什麽是 Session
session 是區别 cookie 的另一(yī)種記錄服務器和客戶端會話(huà)狀态的機制
session 是基于 cookie 實現的,session 存儲在服務器端,sessionid 會被存儲到客戶端的 cookie 中(zhōng)
session 認證流程
用戶第一(yī)次請求服務器的時候,服務器根據用戶提交的相關信息,創建對應的 session
服務器響應客戶端的請求,并返回唯一(yī)标識信息 sessionid 給浏覽器
浏覽器把返回的 sessionid 存儲到 cookie 中(zhōng),同時 cookie 記錄次 sessionid 屬于哪個域名
當用戶第二次訪問服務器的時候,請求自動判斷此域名下(xià)是否存在 cookie 信息,如果存在就将 cookie 信息發送給服務端,服務端會從 cookie 中(zhōng)獲取 sessionid,再根據 sessionid 查找對應的 session 信息,如果找到 session 證明用戶已經登錄,可以執行後面操作,如果沒有找到,說明用戶沒有登錄或者失敗。
三、cookie 和 session 的區别
安全性:session 比 cookie 安全,session 是存儲在服務器端,cookie 是存儲在客戶端
存儲值的類型不同:cookie 隻支持存字符串數據,設置爲其它類型的數據,需要将其轉換成字符串,session 可以存任意數據類型。
有效期不同:cookie 可設置爲長時間保持,session 的失效時間比較短,客戶端關閉就會失效
存儲大(dà)小(xiǎo)不同:單個 cookie 保持的數據不能超過 4KB,Session 存儲數據高于 cookie,當訪問量過多,會占用更多的服務器資(zī)源。
四、什麽是 Token(令牌)
Token
訪問接口(API)時所需要的資(zī)源憑證,比如訂單接口需要帶上登錄返回的 token 值,才能訪問訂單接口數據
常見的 token 組成:UID(用戶唯一(yī)的身份标識)、time(當前時間的時間戳)、sign(簽名,token+ 請求數據進行幾次 md5 之後的值)
token 的特點:
服務端無狀态化、可擴展性好
支持移動端設備
安全性好
支持跨程序調用
token 的身份驗證流程:
①、客戶端使用用戶名和密碼,請求登錄
②、服務端收到請求,驗證用戶名和密碼
③、驗證成功之後,服務端返回一(yī)個 token,并把這個 token 發送給客戶端
④、客戶端收到 token 之後,會把它存儲起來,放(fàng)入 cookie 裏面
⑤、客戶端每次想服務器請求資(zī)源的時候,都需要帶着這個 token
⑥、服務端收到請求的時候,驗證客戶端請求裏面帶着的 token,如果驗證成功,就向客戶端返回請求的數據
每一(yī)次請求都需要攜帶 token,需要把 token 放(fàng)到 HTTP 的請求頭裏面
基于 token 的用戶認證,服務端不用存放(fàng) token 數據。
五、Token 和 session 的區别
Session 是一(yī)種記錄服務器和客戶端會話(huà)狀态的機制,使服務端有狀态化,可以記錄會話(huà)信息。
token 是一(yī)種令牌,訪問接口(API)時需要的憑證,也像古代進入到城裏需要腰牌一(yī)樣。token 使服務器五狀态化,不會存儲會話(huà)信息。
token 的安全性要好于 session,每次請求都有簽名,也就會出現每次的 token 都會變化,也可以防止一(yī)定的攻擊、
六、什麽是 JWT
JSON Web Token(簡稱 JWT)是目前最流行的跨越認證解決方案。
是一(yī)種認證授權機制
JMT 是在網絡應用環境之間傳遞聲明,而執行的一(yī)種基于 JSON 的開(kāi)發标準
JWT 的認證流程:
用戶輸入用戶名/密碼登錄,服務器認證成功之後,會返回一(yī)個 JWT 給客戶端
客戶端将 token 保存到本地(通常使用 localstorge)
當用戶訪問一(yī)個受保護的路由或者資(zī)源的時候,需要請求頭的 Authorization 字段中(zhōng)使用 Bearer 模式添加 JWT
服務端的保護路由将會檢查請求頭 Authorization 中(zhōng)的 JWT 信息,如果合法,則允許用戶的行爲
JWT 内部保護了一(yī)些會話(huà)信息,減少了需要查詢數據庫的需要
JWT 并不使用 cookie,可以使用任何域名提供你的 API 服務,不需要擔心跨域的問題
用戶的狀态不存儲在服務端的内存中(zhōng),是一(yī)種無狀态的認證機制
七、Token 和 JWT 的區别
相同點:
都是訪問資(zī)源的令牌
都可以記錄用戶的信息
都是使服務端無狀态化
都是隻有驗證成功後,客戶端才能訪問服務端上受保護的資(zī)源
兩者的區别:
Token:服務端驗證收到客戶端發送過來的 token 時,需要查詢數據庫獲取用戶信息,驗證 Token 是否有效
JWT:将 Token 和請求信息加密後存儲在客戶端,服務端隻需要使用密鑰進行校驗即可,不需要查詢或者減少查詢數據庫,因爲 JWT 自己包含了用戶信息和加密的數據
常見的前後端鑒權方式:
Session-Cookie
Token 驗證(包括 JWT,sso)
Oauth2.0