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