Cookie和Session的聯(lián)系與區(qū)別
簡述:
Session比Cookie安全,Session是存儲在服務(wù)器端的,Cookie是存儲在客戶端的
背景:
HTTP 是無狀態(tài)協(xié)議,說明它不能以狀態(tài)來區(qū)分和管理請求和響應(yīng)。也就是說,服務(wù)器單從網(wǎng)絡(luò)連接上無從知道客戶身份。
于是想說客戶端們頒發(fā)一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務(wù)器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
什么是Cookie(小甜餅?)
Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,實際上Cookie是服務(wù)器在本地機器上存儲的一小段文本,并隨著每次請求發(fā)送到服務(wù)器。
Cookie會根據(jù)響應(yīng)報文里的一個叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie。當(dāng)下客戶端再向服務(wù)端發(fā)起請求時,客戶端會自動在請求報文中加入Cookie值之后發(fā)送出去
保存時間:
默認情況下,當(dāng)瀏覽器關(guān)閉后,Cookie數(shù)據(jù)被銷毀
持久化存儲:
setMaxAge(int seconds)
正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲。并指定cookie存活時間,時間到后,cookie文件自動失效
負數(shù):默認值
零:刪除cookie信息
應(yīng)用
cookie一般用于存出少量的不太敏感的數(shù)據(jù)
在不登錄的情況下,完成服務(wù)器對客戶端的身份識別
缺點
內(nèi)存小,限制 4KB。數(shù)量限制每個瀏覽器實現(xiàn)不一樣,chrome 是 50 個。
默認有跨域限制,不可設(shè)置跨域共享 cookie,不可設(shè)置跨域傳遞 cookie
什么是Session
session本意是指客戶端與服務(wù)器的會話狀態(tài),由于憑證存儲到了服務(wù)端,后來也把這些存在服務(wù)端的信息稱為session,比如現(xiàn)在服務(wù)器決定自己維護登錄狀態(tài),僅發(fā)給客戶端一個key,然后在自己維護一個key-value表,如果請求中有key,并且在表中可以找到對應(yīng)的value,則視為合法。
銷毀時間
session什么時候被銷毀?
- 服務(wù)器關(guān)閉
- session對象調(diào)用invalidate() 。
- session默認失效時間 30分鐘 選擇性配置修改
缺點
比如 A 服務(wù)器存儲了 Session,就是做了負載均衡后,假如一段時間內(nèi) A 的訪問量激增,會轉(zhuǎn)發(fā)到 B 進行訪問,但是 B 服務(wù)器并沒有存儲 A 的 Session,會導(dǎo)致 Session 的失效
同時session還要考慮跨域問題,不過可以使用redis緩存實現(xiàn),詳見 跨域解決了,那Session怎么辦
區(qū)別
- cookie數(shù)據(jù)存放在客戶的瀏覽器(客戶端)上,session數(shù)據(jù)放在服務(wù)器上,但是服務(wù)端的session的實現(xiàn)對客戶端的cookie有依賴關(guān)系的
- Session沒有數(shù)據(jù)大小限制,Cookie有
- Session數(shù)據(jù)安全,Cookie相對于不安全
- session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能??紤]到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE
聯(lián)系
session依賴于cookie
服務(wù)端執(zhí)行session機制時候會生成session的id值,這個id值會發(fā)送給客戶端,客戶端每次請求都會把這個id值放到http請求的頭部發(fā)送給服務(wù)端,而這個id值在客戶端會保存下來,保存的容器就是cookie,因此當(dāng)我們完全禁掉瀏覽器的cookie的時候,服務(wù)端的session也會不能正常使用(但是這是在你真的就完全不做任何操作的情況下)。
session不是必須依賴cookie!?。?/strong>
如果客戶端禁用了cookie怎么辦呢?
答:
- url重寫
這種方法讓服務(wù)器收到的每個請求中都帶有sessioinId
在每個頁面中的每個鏈接和表單中都添加名為jSessionId的參數(shù),值為當(dāng)前sessionid。
當(dāng)用戶點擊鏈接或提交表單時
服務(wù)器可以通過獲取jSessionId這個參數(shù)來得到客戶端的sessionId,找到sessoin對象
或者:
使用response.encodeURL()對每個請求的URL處理
這個方法會自動追加jsessionid參數(shù),與上面的手動添加效果是一樣的
<a href='<%=response.encodeURL("/jsp/index.jsp") %>' >主頁</a>
它更加智能:它會判斷客戶端瀏覽器是否禁用了Cookie,如果禁用了,那么這個方法在URL后面追加jsessionid,否則不會追加。
- 表單隱藏字段
服務(wù)器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務(wù)器
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
Token
cookie方法不需要服務(wù)器存儲,但是憑證容易被偽造,那有什么辦法判斷憑證是否偽造呢?
和HTTPS一樣,我們可以使用簽名的方式幫助服務(wù)器校驗憑證。
Token可以避免CSRF攻擊
Token可以是無狀態(tài)的,可以在多個服務(wù)間共享
JSON Web Token(簡稱JWT)是以JSON格式存儲信息的Token,其結(jié)構(gòu)圖如下
組成
JWT由3部分構(gòu)成:頭部,負載和簽名。
頭部存儲Token的類型和簽名算法(上圖中,類型是jwt,加密算法是HS256)
負載是Token要存儲的信息(比如存儲用戶姓名和昵稱信息)
簽名是由指定的算法,將轉(zhuǎn)義后的頭部和負載,加上密鑰一同加密得到的。
最后將這三部分用.號連接,就可以得到了一個Token了。
使用JWT維護登陸態(tài),服務(wù)器不再需要維護狀態(tài)表,他僅給客戶端發(fā)送一個加密的數(shù)據(jù)token,每次請求都帶上這個加密的數(shù)據(jù),再解密驗證是否合法即可。由于是加密的數(shù)據(jù),即使用戶可以修改,命中幾率也很小。
token的儲存
一般客戶端用以下方式儲存token
- 存在cookie中,雖然設(shè)置HttpOnly可以有效防止XSS攻擊中token被竊取,但是也就意味著客戶端無法獲取token來設(shè)置CORS頭部。
- 存在sessionStorage或者localStorage中,可以設(shè)置頭部解決跨域資源共享問題,同時也可以防止CSRF,但是就需要考慮XSS的問題防止憑證泄露。
token與cookie的區(qū)別
- cookie 是 http 規(guī)范,token 是自定義傳遞的。
- cookie 沒有被瀏覽器存儲(內(nèi)存是臨時存儲,關(guān)機后信息就沒了。硬盤是長久存儲,不刪除就一直在),下一次請求時便會帶上。而 token 需要自己存儲在瀏覽器,下一次請求時再請求頭中帶上。
- token 默認沒有跨域限制。
- token可以抵抗csrf,cookie+session不行
因為form 發(fā)起的 POST 請求并不受到瀏覽器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域發(fā)送 POST 請求,形成 CSRF 攻擊。在post請求的瞬間,cookie會被瀏覽器自動添加到請求頭中。但token不同,token是開發(fā)者為了防范[CSRF]或XSRF(Cross-site request forgery跨站請求偽造)而特別設(shè)計的令牌,瀏覽器不會自動添加到headers里,攻擊者也無法訪問用戶的token,所以提交的表單無法通過服務(wù)器過濾,也就無法形成攻擊。
所以:session是比cookie更好的一種解決方案。token成為主流,是因為他不需要額外的存儲管理
Web Storage
在 Web Storage 本地存儲 包括 sessionStorage 會話存儲 和 localStorage 本地存儲。
cookie 和 session 完全是服務(wù)器端可以操作的數(shù)據(jù),sessionStorage 和 localStorage 完全是瀏覽器端操作的數(shù)據(jù)。
localStorage與sessionStorage
sessionStorage 和 localStorage 的編程接口是一樣的。
sessionStorage 和 locatlStorage 區(qū)別在于 數(shù)據(jù)存在時間范圍 和 頁面范圍。
sessionStorage: 數(shù)據(jù)只保存到存儲它的窗口或標(biāo)簽關(guān)閉時,數(shù)據(jù)在構(gòu)建它們的窗口或標(biāo)簽內(nèi)也可見
localStorage: 數(shù)據(jù)的生命周期比窗口或瀏覽器的生命周期長,數(shù)據(jù)可被同源的每個窗口或者標(biāo)簽共享,如果一個瀏覽器同時打開兩個tab,localstorage和cookie是共享的,sessionstorage是不共享的
注意:
localstorage,sessionstorage在瀏覽器無痕模式下會存在丟失問題
localStorage、sessionStorage、cookie 區(qū)別
參考文章:文章來源:http://www.zghlxwxcb.cn/news/detail-423860.html
Cookie 和 Session 關(guān)系和區(qū)別
如果客戶端禁用了cookie,通常有兩種方法實現(xiàn)session而不依賴cookie
session依賴cookie,如果瀏覽器禁用了cookie呢文章來源地址http://www.zghlxwxcb.cn/news/detail-423860.html
到了這里,關(guān)于前端數(shù)據(jù)存儲系列(Cookie、Session、localStorage、sessionStorage、Token)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!