面試必問:session,cookie和token的區別

2021-02-19 軟體測試架構師俱樂部
session,cookie和token究竟是什麼
簡述

cookie,session,token作為面試必問題,很多同學能答個大概,但是又迷糊不清,希望本篇文章對大家有所幫助

http是一個無狀態協議

什麼是無狀態呢?就是說這一次請求和上一次請求是沒有任何關係的,互不認識的,沒有關聯的。這種無狀態的的好處是快速。

cookie和session

由於http的無狀態性,為了使某個域名下的所有網頁能夠共享某些數據,session和cookie出現了。客戶端訪問伺服器的流程如下

首先,客戶端會發送一個http請求到伺服器端。

伺服器端接受客戶端請求後,建立一個session,並發送一個http響應到客戶端,這個響應頭,其中就包含Set-Cookie頭部。該頭部包含了sessionId。Set-Cookie格式如下,具體請看Cookie詳解
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

在客戶端發起的第二次請求,假如伺服器給了set-Cookie,瀏覽器會自動在請求頭中添加cookie

伺服器接收請求,分解cookie,驗證信息,核對成功後返回response給客戶端

注意

cookie只是實現session的其中一種方案。雖然是最常用的,但並不是唯一的方法。禁用cookie後還有其他方法存儲,比如放在url中

現在大多都是Session + Cookie,但是只用session不用cookie,或是只用cookie,不用session在理論上都可以保持會話狀態。可是實際中因為多種原因,一般不會單獨使用

用session只需要在客戶端保存一個id,實際上大量數據都是保存在服務端。如果全部用cookie,數據量大的時候客戶端是沒有那麼多空間的。

如果只用cookie不用session,那麼帳戶信息全部保存在客戶端,一旦被劫持,全部信息都會洩露。並且客戶端數據量變大,網絡傳輸的數據量也會變大

cookie和session通俗小結

簡而言之, session 有如用戶信息檔案表, 裡面包含了用戶的認證信息和登錄狀態等信息. 而 cookie 就是用戶通行證

token定義

token 也稱作令牌,由uid+time+sign[+固定參數]
token 的認證方式類似於臨時的證書籤名, 並且是一種服務端無狀態的認證方式, 非常適合於 REST API 的場景. 所謂無狀態就是服務端並不會保存身份認證相關的數據。

token組成存放

token在客戶端一般存放於localStorage,cookie,或sessionStorage中。在伺服器一般存於資料庫中

token認證流程

token 的認證流程與cookie很相似

token可以抵抗csrf,cookie+session不行

因為form 發起的 POST 請求並不受到瀏覽器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域發送 POST 請求,形成 CSRF 攻擊。在post請求的瞬間,cookie會被瀏覽器自動添加到請求頭中。但token不同,token是開發者為了防範csrf而特別設計的令牌,瀏覽器不會自動添加到headers裡,攻擊者也無法訪問用戶的token,所以提交的表單無法通過伺服器過濾,也就無法形成攻擊。

分布式情況下的session和token

我們已經知道session時有狀態的,一般存於伺服器內存或硬碟中,當伺服器採用分布式或集群時,session就會面對負載均衡問題。

而token是無狀態的,token字符串裡就保存了所有的用戶信息

總結

session存儲於伺服器,可以理解為一個狀態列表,擁有一個唯一識別符號sessionId,通常存放於cookie中。伺服器收到cookie後解析出sessionId,再去session列表中查找,才能找到相應session。依賴cookie

cookie類似一個令牌,裝有sessionId,存儲在客戶端,瀏覽器通常會自動添加。

token也類似一個令牌,無狀態,用戶信息都被加密到token中,伺服器收到token後解密就可知道是哪個用戶。需要開發者手動添加。

jwt只是一個跨域認證的方案

補充:JWT

JWT就是token的一種實現方式,並且基本是java web領域的事實標準。

JWT全稱是JSON Web Token。基本可以看出是使用JSON格式傳輸token

JWT 由 3 部分構成:

Header :描述 JWT 的元數據。定義了生成籤名的算法以及 Token 的類型。Payload(負載):用來存放實際需要傳遞的數據Signature(籤名):伺服器通過Payload、Header和一個密鑰(secret)使用 Header 裡面指定的籤名算法(默認是 HMAC SHA256)生成。流程:

在基於 Token 進行身份驗證的的應用程式中,用戶登錄時,伺服器通過Payload、Header和一個密鑰(secret)創建令牌(Token)並將 Token 發送給客戶端,

然後客戶端將 Token 保存在 Cookie 或者 localStorage 裡面,以後客戶端發出的所有請求都會攜帶這個令牌。你可以把它放在 Cookie 裡面自動發送,但是這樣不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization欄位中:Authorization: 你的Token。

往期推薦:

性能測試之nginx訪問日誌分析

相關焦點

  • cookie、session、token區別
    token,session,cookie的概念和區別1.token是 服務經過計算發給客戶端的,服務不保存,每次客戶端來請求,經過解密等計算來驗證是否是自己下發的2.session是服務本地保存,發給客戶端,客戶端每次訪問都帶著,直接和服務的session比對3.cookie是保存在客戶端上的一些基本信息,服務不保存,每次請求時客戶端帶上cookie,裡面有一些帳戶密碼
  • 面試官:要不講講 Cookie、Session、Token、JWT之間的區別?
    根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統也是根據此原理來驗證用戶登錄狀態。Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。
  • Cookie, Session, Token,WebStorage你懂多少?
    面試的時候經常喜歡問一個問題,HTTP協議是有狀態的還是無狀態的?很多同學都不知道,或者簡單背一個答案,曰無狀態.再問,那麼HTTP協議如何保持狀態?只有一小部分同學能答出來要用cookie和session.再問,有了cookie為什麼還要session?更少一部分人能答出來安全。再問,不要cookie行不行?能答出URL重寫的已經不錯了。
  • 前後端接口鑑權全解 Cookie/Session/Token 的區別
    你把 session id 說成 session token 也沒什麼問題(Wikipedia 裡就寫了這個別名)。其中的區別在於,session id 一般存在 cookie 裡,自動帶上;token 一般是要你主動放在請求中,例如設置請求頭的 Authorization 為 bearer:<access_token>。
  • 徹底理解Cookie,Session,Token
    比如說, 小F已經登錄了系統, 我給他發一個令牌(token), 裡邊包含了小F的 user id, 下一次小F 再次通過Http 請求訪問我的時候, 把這個token 通過Http header 帶過來不就可以了。不過這和session id沒有本質區別啊, 任何人都可以可以偽造, 所以我得想點兒辦法, 讓別人偽造不了。
  • 測開之Cookie、Session、Token、JWT的區別
    Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。Token 和 Session 的區別Session 是一種記錄伺服器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話信息。而 Token 是令牌,訪問資源接口(API)時所需要的資源憑證。
  • 詳解 Cookie,Session,Token
    和 localStorage;session什麼是sessionsession從字面上講,就是會話。Cookie和Session的區別存儲位置不同:cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上隱私策略不同:cookie不是很安全, 別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用sessionsession會在一定時間內保存在伺服器上。
  • Cookie、Session、Token與JWT解析
    Token 的缺點那有人就問了,既然 token 這麼好,那為什麼各個大公司幾乎都採用共享 session 的方式呢,可能很多人是第一次聽到 token,token 不香嗎?其實我們把 cookie 和 token 比較本身就不合理,一個是存儲方式,一個是驗證方式,正確的比較應該是 session vs token。
  • 黑客都知道的Cookie、Session、Token、JWT
    根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統也是根據此原理來驗證用戶登錄狀態。Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。
  • 一文讀懂Cookie、Session、Token和JWT(建議收藏)
    Session 的區別什麼是 Token(令牌)Token 和 Session 的區別什麼是 JWTToken 和 JWT 的區別常見的前後端鑑權方式常見的加密算法常見問題什麼是認證(Authentication)什麼是授權(Authorization)什麼是憑證(Credentials
  • Cookie、Session、Token、JWT終於講清楚了
    Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。token=xxx項目中使用 JWT項目地址:https://github.com/yjdjiayou/jwt-demoToken 和 JWT 的區別相同:區別:8、常見的前後端鑑權方式
  • 一文帶你徹底搞懂Cookie、Session和Token
    4、Token通常意義上的token是把session中的內容都放到token中(可以明文形式或者用對稱加密算法加密(加密密鑰放在伺服器端),然後再把這些內容做hash籤名(密鑰在伺服器),把內容和其籤名拼接成一個字符串(這個就是token) 發送給客戶端。
  • Session/Cookie/Token 還傻傻分不清?
    token 的介紹有誤,所以對 cookie,session, token 作了一下對比(文中token指jwt token)相信大家看完肯定有收穫!token 有哪些缺點那有人就問了,既然 token 這麼好,那為什麼各個大公司幾乎都採用共享 session 的方式呢,可能很多人是第一次聽到 token,token 不香嗎? to
  • 熬夜徹底搞懂Cookie Session Token JWT
    記憶力不好的優點就是一個字「快」;缺點也很明顯,需要借靠 cookie、session 、token等機制將客戶端多次請求關聯起來。想像一下如果沒有 cookie、session、token 這樣的機制,我們在網站上每次點擊都需要重新輸入密碼認證,這樣槽糕的體驗你還願意繼續用嗎?
  • 還傻傻分不清 Cookie、Session、Token、JWT?
    Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。Token 和 Session 的區別Session 是一種記錄伺服器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話信息。而 Token 是令牌,訪問資源接口(API)時所需要的資源憑證。
  • 最全session和cookie的區別
    2、什麼是sessionsession的定義很抽象,在不同的場合中session一詞的含義也很不相同.它可以代表伺服器與瀏覽器的一次會話過程,指從一個瀏覽器窗口打開到關閉的這個期間.也可以用於指一類用來在客戶端與伺服器之間保持狀態的解決方案。session從字面上講,就是會話。這個就類似於你和一個人交談,你怎麼知道當前和你交談的是張三而不是李四呢?
  • 認識Cookie與Session的區別與應用
    >Session的客戶端實現形式(即Session ID的保存方法)一般瀏覽器提供了兩種方式來保存,還有一種是程式設計師使用HTML隱藏域的方式自定義實現:[1] 使用Cookie來保存,這是最常見的方法,本文「記住我的登錄狀態」功能的實現正式基於這種方式的。
  • 你還傻傻分不清Cookie、Session、Token、JWT嗎?
    相關專題推薦:php session 會話(專題)Cookie 和 Session 的區別安全性: Session 比 Cookie 安全,Session 是存儲在伺服器端的,Cookie 是存儲在客戶端的。
  • Web基礎技術 | Cookie、Session和Token認證
    Cookie:cookie是伺服器發送給客戶端的用於驗證某一會話信息的數據,cookie中有很多欄位。不同網站Cookie中欄位是不一樣的,是由伺服器端設置的。Cookie中常放入session_id 或者 token 用來驗證會話的登錄狀態。Cookie為什麼能驗證登錄狀態?
  • 還分不清 Cookie、Session、Token、JWT?一篇文章講清楚
    Token 和 Session 的區別 Session 是一種記錄伺服器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話信息。而 Token 是令牌,訪問資源接口(API)時所需要的資源憑證。Token 使服務端無狀態化,不會存儲會話信息。