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