expires为session_面试必问:session,cookie和token的区别
點(diǎn)擊上方藍(lán)字關(guān)注我們 !
session,cookie和token究竟是什么
簡(jiǎn)述
cookie,session,token作為面試必問(wèn)題,很多同學(xué)能答個(gè)大概,但是又迷糊不清,希望本篇文章對(duì)大家有所幫助
http是一個(gè)無(wú)狀態(tài)協(xié)議
什么是無(wú)狀態(tài)呢?就是說(shuō)這一次請(qǐng)求和上一次請(qǐng)求是沒有任何關(guān)系的,互不認(rèn)識(shí)的,沒有關(guān)聯(lián)的。這種無(wú)狀態(tài)的的好處是快速。
cookie和session
由于http的無(wú)狀態(tài)性,為了使某個(gè)域名下的所有網(wǎng)頁(yè)能夠共享某些數(shù)據(jù),session和cookie出現(xiàn)了。客戶端訪問(wèn)服務(wù)器的流程如下
首先,客戶端會(huì)發(fā)送一個(gè)http請(qǐng)求到服務(wù)器端。
服務(wù)器端接受客戶端請(qǐng)求后,建立一個(gè)session,并發(fā)送一個(gè)http響應(yīng)到客戶端,這個(gè)響應(yīng)頭,其中就包含Set-Cookie頭部。該頭部包含了sessionId。Set-Cookie格式如下,具體請(qǐng)看Cookie詳解Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
在客戶端發(fā)起的第二次請(qǐng)求,假如服務(wù)器給了set-Cookie,瀏覽器會(huì)自動(dòng)在請(qǐng)求頭中添加cookie
服務(wù)器接收請(qǐng)求,分解cookie,驗(yàn)證信息,核對(duì)成功后返回response給客戶端
注意
cookie只是實(shí)現(xiàn)session的其中一種方案。雖然是最常用的,但并不是唯一的方法。禁用cookie后還有其他方法存儲(chǔ),比如放在url中
現(xiàn)在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理論上都可以保持會(huì)話狀態(tài)??墒菍?shí)際中因?yàn)槎喾N原因,一般不會(huì)單獨(dú)使用
用session只需要在客戶端保存一個(gè)id,實(shí)際上大量數(shù)據(jù)都是保存在服務(wù)端。如果全部用cookie,數(shù)據(jù)量大的時(shí)候客戶端是沒有那么多空間的。
如果只用cookie不用session,那么賬戶信息全部保存在客戶端,一旦被劫持,全部信息都會(huì)泄露。并且客戶端數(shù)據(jù)量變大,網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量也會(huì)變大
cookie和session通俗小結(jié)
簡(jiǎn)而言之, session 有如用戶信息檔案表, 里面包含了用戶的認(rèn)證信息和登錄狀態(tài)等信息. 而 cookie 就是用戶通行證
token定義
token 也稱作令牌,由uid+time+sign[+固定參數(shù)]
token 的認(rèn)證方式類似于臨時(shí)的證書簽名, 并且是一種服務(wù)端無(wú)狀態(tài)的認(rèn)證方式, 非常適合于 REST API 的場(chǎng)景. 所謂無(wú)狀態(tài)就是服務(wù)端并不會(huì)保存身份認(rèn)證相關(guān)的數(shù)據(jù)。
token組成
uid: 用戶唯一身份標(biāo)識(shí)
time: 當(dāng)前時(shí)間的時(shí)間戳
sign: 簽名, 使用 hash/encrypt 壓縮成定長(zhǎng)的十六進(jìn)制字符串,以防止第三方惡意拼接
固定參數(shù)(可選): 將一些常用的固定參數(shù)加入到 token 中是為了避免重復(fù)查庫(kù)
存放
token在客戶端一般存放于localStorage,cookie,或sessionStorage中。在服務(wù)器一般存于數(shù)據(jù)庫(kù)中
token認(rèn)證流程
token 的認(rèn)證流程與cookie很相似
用戶登錄,成功后服務(wù)器返回Token給客戶端。
客戶端收到數(shù)據(jù)后保存在客戶端
客戶端再次訪問(wèn)服務(wù)器,將token放入headers中
服務(wù)器端采用filter過(guò)濾器校驗(yàn)。校驗(yàn)成功則返回請(qǐng)求數(shù)據(jù),校驗(yàn)失敗則返回錯(cuò)誤碼
token可以抵抗csrf,cookie+session不行
因?yàn)閒orm 發(fā)起的 POST 請(qǐng)求并不受到瀏覽器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域發(fā)送 POST 請(qǐng)求,形成 CSRF 攻擊。在post請(qǐng)求的瞬間,cookie會(huì)被瀏覽器自動(dòng)添加到請(qǐng)求頭中。但token不同,token是開發(fā)者為了防范csrf而特別設(shè)計(jì)的令牌,瀏覽器不會(huì)自動(dòng)添加到headers里,攻擊者也無(wú)法訪問(wèn)用戶的token,所以提交的表單無(wú)法通過(guò)服務(wù)器過(guò)濾,也就無(wú)法形成攻擊。
分布式情況下的session和token
我們已經(jīng)知道session時(shí)有狀態(tài)的,一般存于服務(wù)器內(nèi)存或硬盤中,當(dāng)服務(wù)器采用分布式或集群時(shí),session就會(huì)面對(duì)負(fù)載均衡問(wèn)題。
負(fù)載均衡多服務(wù)器的情況,不好確認(rèn)當(dāng)前用戶是否登錄,因?yàn)槎喾?wù)器不共享session。這個(gè)問(wèn)題也可以將session存在一個(gè)服務(wù)器中來(lái)解決,但是就不能完全達(dá)到負(fù)載均衡的效果。當(dāng)今的幾種解決session負(fù)載均衡的方法。
而token是無(wú)狀態(tài)的,token字符串里就保存了所有的用戶信息
客戶端登陸傳遞信息給服務(wù)端,服務(wù)端收到后把用戶信息加密(token)傳給客戶端,客戶端將token存放于localStroage等容器中??蛻舳嗣看卧L問(wèn)都傳遞token,服務(wù)端解密token,就知道這個(gè)用戶是誰(shuí)了。通過(guò)cpu加解密,服務(wù)端就不需要存儲(chǔ)session占用存儲(chǔ)空間,就很好的解決負(fù)載均衡多服務(wù)器的問(wèn)題了。這個(gè)方法叫做JWT(Json Web Token)
總結(jié)
session存儲(chǔ)于服務(wù)器,可以理解為一個(gè)狀態(tài)列表,擁有一個(gè)唯一識(shí)別符號(hào)sessionId,通常存放于cookie中。服務(wù)器收到cookie后解析出sessionId,再去session列表中查找,才能找到相應(yīng)session。依賴cookie
cookie類似一個(gè)令牌,裝有sessionId,存儲(chǔ)在客戶端,瀏覽器通常會(huì)自動(dòng)添加。
token也類似一個(gè)令牌,無(wú)狀態(tài),用戶信息都被加密到token中,服務(wù)器收到token后解密就可知道是哪個(gè)用戶。需要開發(fā)者手動(dòng)添加。
jwt只是一個(gè)跨域認(rèn)證的方案
補(bǔ)充:JWT
JWT就是token的一種實(shí)現(xiàn)方式,并且基本是java web領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。
JWT全稱是JSON Web Token?;究梢钥闯鍪鞘褂肑SON格式傳輸token
JWT 由 3 部分構(gòu)成:
Header :描述 JWT 的元數(shù)據(jù)。定義了生成簽名的算法以及 Token 的類型。Payload(負(fù)載):用來(lái)存放實(shí)際需要傳遞的數(shù)據(jù)Signature(簽名):服務(wù)器通過(guò)Payload、Header和一個(gè)密鑰(secret)使用 Header 里面指定的簽名算法(默認(rèn)是 HMAC SHA256)生成。流程:
在基于 Token 進(jìn)行身份驗(yàn)證的的應(yīng)用程序中,用戶登錄時(shí),服務(wù)器通過(guò)Payload、Header和一個(gè)密鑰(secret)創(chuàng)建令牌(Token)并將 Token 發(fā)送給客戶端,
然后客戶端將 Token 保存在 Cookie 或者 localStorage 里面,以后客戶端發(fā)出的所有請(qǐng)求都會(huì)攜帶這個(gè)令牌。你可以把它放在 Cookie 里面自動(dòng)發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:Authorization: 你的Token。
好文!點(diǎn)個(gè)好看!往期推薦:
性能測(cè)試之nginx訪問(wèn)日志分析
總結(jié)
以上是生活随笔為你收集整理的expires为session_面试必问:session,cookie和token的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ios nstimer实现延时_iOS中
- 下一篇: 最常见的水平拆分规则