日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

expires为session_面试必问:session,cookie和token的区别

發(fā)布時間:2025/3/15 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 expires为session_面试必问:session,cookie和token的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方藍字關(guān)注我們 !

session,cookie和token究竟是什么

簡述

cookie,session,token作為面試必問題,很多同學(xué)能答個大概,但是又迷糊不清,希望本篇文章對大家有所幫助

http是一個無狀態(tài)協(xié)議

什么是無狀態(tài)呢?就是說這一次請求和上一次請求是沒有任何關(guān)系的,互不認識的,沒有關(guān)聯(lián)的。這種無狀態(tài)的的好處是快速。

cookie和session

由于http的無狀態(tài)性,為了使某個域名下的所有網(wǎng)頁能夠共享某些數(shù)據(jù),session和cookie出現(xiàn)了。客戶端訪問服務(wù)器的流程如下

  • 首先,客戶端會發(fā)送一個http請求到服務(wù)器端。

  • 服務(wù)器端接受客戶端請求后,建立一個session,并發(fā)送一個http響應(yīng)到客戶端,這個響應(yīng)頭,其中就包含Set-Cookie頭部。該頭部包含了sessionId。Set-Cookie格式如下,具體請看Cookie詳解Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

  • 在客戶端發(fā)起的第二次請求,假如服務(wù)器給了set-Cookie,瀏覽器會自動在請求頭中添加cookie

  • 服務(wù)器接收請求,分解cookie,驗證信息,核對成功后返回response給客戶端

注意

  • cookie只是實現(xiàn)session的其中一種方案。雖然是最常用的,但并不是唯一的方法。禁用cookie后還有其他方法存儲,比如放在url中

  • 現(xiàn)在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理論上都可以保持會話狀態(tài)。可是實際中因為多種原因,一般不會單獨使用

  • 用session只需要在客戶端保存一個id,實際上大量數(shù)據(jù)都是保存在服務(wù)端。如果全部用cookie,數(shù)據(jù)量大的時候客戶端是沒有那么多空間的。

  • 如果只用cookie不用session,那么賬戶信息全部保存在客戶端,一旦被劫持,全部信息都會泄露。并且客戶端數(shù)據(jù)量變大,網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量也會變大

cookie和session通俗小結(jié)

簡而言之, session 有如用戶信息檔案表, 里面包含了用戶的認證信息和登錄狀態(tài)等信息. 而 cookie 就是用戶通行證

token定義

token 也稱作令牌,由uid+time+sign[+固定參數(shù)]
token 的認證方式類似于臨時的證書簽名, 并且是一種服務(wù)端無狀態(tài)的認證方式, 非常適合于 REST API 的場景. 所謂無狀態(tài)就是服務(wù)端并不會保存身份認證相關(guān)的數(shù)據(jù)。

token組成

  • uid: 用戶唯一身份標識

  • time: 當前時間的時間戳

  • sign: 簽名, 使用 hash/encrypt 壓縮成定長的十六進制字符串,以防止第三方惡意拼接

  • 固定參數(shù)(可選): 將一些常用的固定參數(shù)加入到 token 中是為了避免重復(fù)查庫

存放

token在客戶端一般存放于localStorage,cookie,或sessionStorage中。在服務(wù)器一般存于數(shù)據(jù)庫中

token認證流程

token 的認證流程與cookie很相似

  • 用戶登錄,成功后服務(wù)器返回Token給客戶端。

  • 客戶端收到數(shù)據(jù)后保存在客戶端

  • 客戶端再次訪問服務(wù)器,將token放入headers中

  • 服務(wù)器端采用filter過濾器校驗。校驗成功則返回請求數(shù)據(jù),校驗失敗則返回錯誤碼

token可以抵抗csrf,cookie+session不行

因為form 發(fā)起的 POST 請求并不受到瀏覽器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域發(fā)送 POST 請求,形成 CSRF 攻擊。在post請求的瞬間,cookie會被瀏覽器自動添加到請求頭中。但token不同,token是開發(fā)者為了防范csrf而特別設(shè)計的令牌,瀏覽器不會自動添加到headers里,攻擊者也無法訪問用戶的token,所以提交的表單無法通過服務(wù)器過濾,也就無法形成攻擊。

分布式情況下的session和token

我們已經(jīng)知道session時有狀態(tài)的,一般存于服務(wù)器內(nèi)存或硬盤中,當服務(wù)器采用分布式或集群時,session就會面對負載均衡問題。

  • 負載均衡多服務(wù)器的情況,不好確認當前用戶是否登錄,因為多服務(wù)器不共享session。這個問題也可以將session存在一個服務(wù)器中來解決,但是就不能完全達到負載均衡的效果。當今的幾種解決session負載均衡的方法。

而token是無狀態(tài)的,token字符串里就保存了所有的用戶信息

  • 客戶端登陸傳遞信息給服務(wù)端,服務(wù)端收到后把用戶信息加密(token)傳給客戶端,客戶端將token存放于localStroage等容器中。客戶端每次訪問都傳遞token,服務(wù)端解密token,就知道這個用戶是誰了。通過cpu加解密,服務(wù)端就不需要存儲session占用存儲空間,就很好的解決負載均衡多服務(wù)器的問題了。這個方法叫做JWT(Json Web Token)

總結(jié)

  • session存儲于服務(wù)器,可以理解為一個狀態(tài)列表,擁有一個唯一識別符號sessionId,通常存放于cookie中。服務(wù)器收到cookie后解析出sessionId,再去session列表中查找,才能找到相應(yīng)session。依賴cookie

  • cookie類似一個令牌,裝有sessionId,存儲在客戶端,瀏覽器通常會自動添加。

  • token也類似一個令牌,無狀態(tài),用戶信息都被加密到token中,服務(wù)器收到token后解密就可知道是哪個用戶。需要開發(fā)者手動添加。

  • jwt只是一個跨域認證的方案

補充:JWT

JWT就是token的一種實現(xiàn)方式,并且基本是java web領(lǐng)域的事實標準。

JWT全稱是JSON Web Token。基本可以看出是使用JSON格式傳輸token

JWT 由 3 部分構(gòu)成:

Header :描述 JWT 的元數(shù)據(jù)。定義了生成簽名的算法以及 Token 的類型。Payload(負載):用來存放實際需要傳遞的數(shù)據(jù)Signature(簽名):服務(wù)器通過Payload、Header和一個密鑰(secret)使用 Header 里面指定的簽名算法(默認是 HMAC SHA256)生成。流程:

在基于 Token 進行身份驗證的的應(yīng)用程序中,用戶登錄時,服務(wù)器通過Payload、Header和一個密鑰(secret)創(chuàng)建令牌(Token)并將 Token 發(fā)送給客戶端,

然后客戶端將 Token 保存在 Cookie 或者 localStorage 里面,以后客戶端發(fā)出的所有請求都會攜帶這個令牌。你可以把它放在 Cookie 里面自動發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:Authorization: 你的Token。

好文!點個好看!

往期推薦:

性能測試之nginx訪問日志分析

總結(jié)

以上是生活随笔為你收集整理的expires为session_面试必问:session,cookie和token的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。