|
本文的組織脈絡(luò)如下 Cookie 和 SessionHTTP 協(xié)議是一種 Session 是什么客戶(hù)端請(qǐng)求服務(wù)端,服務(wù)端會(huì)為這次請(qǐng)求開(kāi)辟一塊 Session 如何判斷是否是同一會(huì)話服務(wù)器第一次接收到請(qǐng)求時(shí),開(kāi)辟了一塊 Session 空間(創(chuàng)建了Session對(duì)象),同時(shí)生成一個(gè) sessionId ,并通過(guò)響應(yīng)頭的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客戶(hù)端發(fā)送要求設(shè)置 Cookie 的響應(yīng);客戶(hù)端收到響應(yīng)后,在本機(jī)客戶(hù)端設(shè)置了一個(gè) JSESSIONID=XXXXXXX 的 Cookie 信息,該 Cookie 的過(guò)期時(shí)間為瀏覽器會(huì)話結(jié)束。 接下來(lái)客戶(hù)端每次向同一個(gè)網(wǎng)站發(fā)送請(qǐng)求時(shí),請(qǐng)求頭都會(huì)帶上該 Cookie 信息(包含 sessionId ), 然后,服務(wù)器通過(guò)讀取請(qǐng)求頭中的 Cookie 信息,獲取名稱(chēng)為 JSESSIONID 的值,得到此次請(qǐng)求的 sessionId。 Session 的缺點(diǎn)Session 機(jī)制有個(gè)缺點(diǎn),比如 A 服務(wù)器存儲(chǔ)了 Session,就是做了負(fù)載均衡后,假如一段時(shí)間內(nèi) A 的訪問(wèn)量激增,會(huì)轉(zhuǎn)發(fā)到 B 進(jìn)行訪問(wèn),但是 B 服務(wù)器并沒(méi)有存儲(chǔ) A 的 Session,會(huì)導(dǎo)致 Session 的失效。 Cookies 是什么HTTP 協(xié)議中的 Cookie 包括
Cookie 主要用于下面三個(gè)目的
登陸、購(gòu)物車(chē)、游戲得分或者服務(wù)器應(yīng)該記住的其他內(nèi)容
用戶(hù)偏好、主題或者其他設(shè)置
記錄和分析用戶(hù)行為 Cookie 曾經(jīng)用于一般的客戶(hù)端存儲(chǔ)。雖然這是合法的,因?yàn)樗鼈兪窃诳蛻?hù)端上存儲(chǔ)數(shù)據(jù)的唯一方法,但如今建議使用現(xiàn)代存儲(chǔ) API。Cookie 隨每個(gè)請(qǐng)求一起發(fā)送,因此它們可能會(huì)降低性能(尤其是對(duì)于移動(dòng)數(shù)據(jù)連接而言)。 創(chuàng)建 Cookie當(dāng)接收到客戶(hù)端發(fā)出的 HTTP 請(qǐng)求時(shí),服務(wù)器可以發(fā)送帶有響應(yīng)的 Set-Cookie 和 Cookie 標(biāo)頭
此標(biāo)頭告訴客戶(hù)端存儲(chǔ) Cookie 現(xiàn)在,隨著對(duì)服務(wù)器的每個(gè)新請(qǐng)求,瀏覽器將使用 Cookie 頭將所有以前存儲(chǔ)的 Cookie 發(fā)送回服務(wù)器。 有兩種類(lèi)型的 Cookies,一種是 Session Cookies,一種是 Persistent Cookies,如果 Cookie 不包含到期日期,則將其視為會(huì)話 Cookie。會(huì)話 Cookie 存儲(chǔ)在內(nèi)存中,永遠(yuǎn)不會(huì)寫(xiě)入磁盤(pán),當(dāng)瀏覽器關(guān)閉時(shí),此后 Cookie 將永久丟失。如果 Cookie 包含 還有一種是 會(huì)話 Cookies上面的示例創(chuàng)建的是會(huì)話 Cookie ,會(huì)話 Cookie 有個(gè)特征,客戶(hù)端關(guān)閉時(shí) Cookie 會(huì)刪除,因?yàn)樗鼪](méi)有指定 但是,Web 瀏覽器可能會(huì)使用會(huì)話還原,這會(huì)使大多數(shù)會(huì)話 Cookie 保持永久狀態(tài),就像從未關(guān)閉過(guò)瀏覽器一樣。 永久性 Cookies永久性 Cookie 不會(huì)在客戶(hù)端關(guān)閉時(shí)過(guò)期,而是在 Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;Cookie的 Secure 和 HttpOnly 標(biāo)記安全的 Cookie 需要經(jīng)過(guò) HTTPS 協(xié)議通過(guò)加密的方式發(fā)送到服務(wù)器。即使是安全的,也不應(yīng)該將敏感信息存儲(chǔ)在cookie 中,因?yàn)樗鼈儽举|(zhì)上是不安全的,并且此標(biāo)志不能提供真正的保護(hù)。 HttpOnly 的作用
Cookie 的作用域
例如,如果設(shè)置 例如,設(shè)置
JSON Web Token 和 Session Cookies 的對(duì)比
下面是 JWT 和 Session 不同之處的研究 JWT 和 Session Cookies 的相同之處在探討 JWT 和 Session Cookies 之前,有必要需要先去理解一下它們的相同之處。 它們既可以對(duì)用戶(hù)進(jìn)行身份驗(yàn)證,也可以用來(lái)在用戶(hù)單擊進(jìn)入不同頁(yè)面時(shí)以及登陸網(wǎng)站或應(yīng)用程序后進(jìn)行身份驗(yàn)證。 如果沒(méi)有這兩者,那你可能需要在每個(gè)頁(yè)面切換時(shí)都需要進(jìn)行登錄了。因?yàn)?HTTP 是一個(gè)無(wú)狀態(tài)的協(xié)議。這也就意味著當(dāng)你訪問(wèn)某個(gè)網(wǎng)頁(yè),然后單擊同一站點(diǎn)上的另一個(gè)頁(yè)面時(shí),服務(wù)器的 因此,如果你登錄并訪問(wèn)了你有權(quán)訪問(wèn)的另一個(gè)頁(yè)面,由于 HTTP 不會(huì)記錄你剛剛登錄的信息,因此你將再次登錄。 JWT 和 Session Cookies 就是用來(lái)處理在不同頁(yè)面之間切換,保存用戶(hù)登錄信息的機(jī)制。 也就是說(shuō),這兩種技術(shù)都是用來(lái)保存你的登錄狀態(tài),能夠讓你在瀏覽任意受密碼保護(hù)的網(wǎng)站。通過(guò)在每次產(chǎn)生新的請(qǐng)求時(shí)對(duì)用戶(hù)數(shù)據(jù)進(jìn)行身份驗(yàn)證來(lái)解決此問(wèn)題。 所以 JWT 和 Session Cookies 的相同之處是什么?那就是它們能夠支持你在發(fā)送不同請(qǐng)求之間,記錄并驗(yàn)證你的登錄狀態(tài)的一種機(jī)制。 什么是 Session CookiesSession Cookies 也稱(chēng)為 在每次請(qǐng)求時(shí),服務(wù)器都會(huì)從會(huì)話 Cookie 中讀取 SessionId,如果服務(wù)端的數(shù)據(jù)和讀取的 SessionId 相同,那么服務(wù)器就會(huì)發(fā)送響應(yīng)給瀏覽器,允許用戶(hù)登錄。 什么是 Json Web TokensJson Web Token 的簡(jiǎn)稱(chēng)就是 JWT,通常可以稱(chēng)為 使用 JWT 主要用來(lái)下面兩點(diǎn)
JWT 的格式下面,我們會(huì)探討一下 JWT 的組成和格式是什么 JWT 主要由三部分組成,每個(gè)部分用
因此,一個(gè)非常簡(jiǎn)單的 JWT 組成會(huì)是下面這樣 然后我們分別對(duì)不同的部分進(jìn)行探討。 Header Header 是 JWT 的標(biāo)頭,它通常由兩部分組成: 例如 指定類(lèi)型和簽名算法后,Json 塊被 Payload Token 的第二部分是
例如 {然后 payload Json 塊會(huì)被 signature JWT 的第三部分是一個(gè)簽證信息,這個(gè)簽證信息由三部分組成
比如我們需要 HMAC SHA256 算法進(jìn)行簽名 簽名用于驗(yàn)證消息在此過(guò)程中沒(méi)有更改,并且對(duì)于使用私鑰進(jìn)行簽名的令牌,它還可以驗(yàn)證 JWT 的發(fā)送者的真實(shí)身份 拼湊在一起現(xiàn)在我們把上面的三個(gè)由點(diǎn)分隔的 Base64-URL 字符串部分組成在一起,這個(gè)字符串可以在 HTML 和 HTTP 環(huán)境中輕松傳遞這些字符串。 下面是一個(gè)完整的 JWT 示例,它對(duì) header 和 payload 進(jìn)行編碼,然后使用 signature 進(jìn)行簽名 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
如果想自己測(cè)試編寫(xiě)的話,可以訪問(wèn) JWT 官網(wǎng) https:///#debugger-io JWT 和 Session Cookies 的不同JWT 和 Session Cookies 都提供安全的用戶(hù)身份驗(yàn)證,但是它們有以下幾點(diǎn)不同 密碼簽名JWT 具有加密簽名,而 Session Cookies 則沒(méi)有。 JSON 是無(wú)狀態(tài)的JWT 是 身份驗(yàn)證可以在 可擴(kuò)展性Session Cookies 是存儲(chǔ)在服務(wù)器內(nèi)存中,這就意味著如果網(wǎng)站或者應(yīng)用很大的情況下會(huì)耗費(fèi)大量的資源。由于 JWT 是無(wú)狀態(tài)的,在許多情況下,它們可以節(jié)省服務(wù)器資源。因此 JWT 要比 Session Cookies 具有更強(qiáng)的 JWT 支持跨域認(rèn)證Session Cookies 只能用在 使用 JWT 可以解決這個(gè)問(wèn)題,使用 JWT 能夠通過(guò) JWT 和 Session Cookies 的選型我們上面探討了 JWT 和 Cookies 的不同點(diǎn),相信你也會(huì)對(duì)選型有了更深的認(rèn)識(shí),大致來(lái)說(shuō) 對(duì)于只需要登錄用戶(hù)并訪問(wèn)存儲(chǔ)在站點(diǎn)數(shù)據(jù)庫(kù)中的一些信息的中小型網(wǎng)站來(lái)說(shuō),Session Cookies 通常就能滿(mǎn)足。 如果你有企業(yè)級(jí)站點(diǎn),應(yīng)用程序或附近的站點(diǎn),并且需要處理大量的請(qǐng)求,尤其是第三方或很多第三方(包括位于不同域的API),則 JWT 顯然更適合。 后記前兩天面試的時(shí)候問(wèn)到了這個(gè)題,所以寫(xiě)篇文章總結(jié)一下,還問(wèn)到了一個(gè)面試題,禁用 Cookies,如何使用 Session ?網(wǎng)上百度了一下,發(fā)現(xiàn)這是 PHP 的面試題,em.....
但還是選擇了解了一下,如何禁用 Cookies 后,使用 Session
相關(guān)參考: https://www.cnblogs.com/Renyi-Fan/p/11012086.html https://blog.csdn.net/qq_28296925/article/details/80921585 https://www.cnblogs.com/-ROCKS/p/6108556.html https://www./manage-cookies/ https://www.jianshu.com/p/4a124a10fcaf https://tools./html/rfc7519 https:///introduction/ https:///blog/browser-cache-vs-cookies-difference/ https:///blog/difference-json-web-tokens-vs-session-cookies/ |
|
|