【Java面試題】cookie、session、jwt/token的異同

以下是對Cookie、Session、Token與JWT的異同的完善分析,結合技術原理、安全性和應用場景進行系統性對比:


🔍 一、核心概念與工作流程

機制定義工作流程核心特點
Cookie客戶端存儲的小型文本數據1. 服務器通過Set-Cookie響應頭下發數據
2. 瀏覽器自動在后續請求中通過Cookie頭回傳
3. 服務器解析Cookie獲取用戶狀態
依賴瀏覽器自動管理,可設置有效期、作用域和安全性屬性(如HttpOnly
Session服務器端存儲的用戶會話數據1. 登錄后服務器生成唯一Session ID并存入服務器
2. Session ID通過Cookie發送給客戶端
3. 后續請求攜帶Session ID,服務器據此查詢會話數據
有狀態:會話數據存儲在服務端(內存/數據庫)
Token廣義的認證令牌(如UUID、OAuth令牌)1. 登錄后服務器生成令牌返回客戶端
2. 客戶端在請求頭(如Authorization)中手動攜帶令牌
3. 服務器驗證令牌有效性
無狀態:服務端不存儲令牌數據,驗證依賴簽名或密鑰
JWT特定格式的Token(JSON Web Token)1. 登錄后生成包含用戶信息的JWT(Header+Payload+Signature)
2. 客戶端存儲JWT并在請求頭中傳遞
3. 服務端驗證簽名和有效期
自包含:用戶信息直接編碼在Token中,無需查庫

?? 二、關鍵異同對比

1. 存儲位置與狀態管理
特性CookieSessionTokenJWT
存儲位置客戶端瀏覽器服務端(數據)+ 客戶端(ID)客戶端客戶端
狀態性依賴服務端Session時為有狀態有狀態(服務端維護數據)無狀態(服務端不存儲)無狀態(自包含用戶信息)
跨域支持受限(需設置domain需額外配置(如共享Redis)天然支持天然支持
2. 數據結構與安全性
項目CookieSessionToken/JWT
數據格式鍵值對文本(≤4KB)任意類型(對象/數組)JWT為三段式Base64編碼(Header.Payload.Signature)
敏感信息存儲不安全(需避免存儲敏感數據)安全(數據在服務端)JWT的Payload僅Base64編碼(非加密),避免存儲敏感信息
主要風險CSRF、XSSSession劫持、服務器資源耗盡JWT密鑰泄露、令牌盜用
安全增強HttpOnlySecureSameSite定期過期、IP綁定HS256/RS256強簽名算法、短期有效期
3. 性能與擴展性
  • Cookie
    每次請求自動攜帶,增加帶寬開銷;適合單體應用,但跨域場景性能受限。
  • Session
    高并發時服務端存儲壓力大,分布式系統需引入Redis等共享存儲,增加架構復雜性。
  • Token/JWT
    無狀態特性天然適合分布式系統和微服務,無需會話同步;但JWT的Payload過大會影響網絡傳輸效率。

🛡? 三、核心問題與解決方案

1. JWT的獨特挑戰
問題原因解決方案
無法主動注銷服務端無狀態,無法廢止已簽發Token引入黑名單機制(如Redis記錄失效Token)
令牌續期體驗差過期后需重新登錄雙Token機制(Access Token+Refresh Token)
Payload安全性Base64非加密,信息可被客戶端解碼敏感信息加密存儲(如JWE格式)
2. Session vs JWT 適用場景
  • 選Session的場景
    • 傳統單體應用(如銀行系統),需嚴格會話管理
    • 需要實時禁用用戶(如管理員踢人)
    • 存儲敏感數據(如支付憑證)
  • 選JWT的場景
    • 前后端分離/微服務架構(如React+Node.js)
    • 跨域認證(如單點登錄SSO)
    • 移動端API認證(減少服務端壓力)

💎 四、總結:技術選型決策樹

  1. 是否需要服務端強管控?
    • → 選擇 Session(實時管理會話)
    • → 進入下一步
  2. 系統是否分布式?
    • → 選擇 JWT(無狀態擴展)
    • → 進入下一步
  3. 數據敏感性優先級?
    • → 選擇 Session(服務端存儲更安全)
    • → 選擇 Cookie/簡單Token(輕量級場景)

最佳實踐:現代系統常組合使用,如:

  • 網關層用JWT做無狀態認證 → 內部服務用Session管理業務狀態
  • 敏感操作(如支付)用Session → 普通API用JWT

通過以上對比,可依據業務需求在狀態管理安全控制架構復雜度間取得平衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86374.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字經濟時代科技創業的巨大潛力

2025年3月,42歲的字節跳動創始人張一鳴以655億美元身家成為中國新首富。這位"80后"企業家白手起家的故事,展現了數字經濟時代科技創業的巨大潛力。本文將帶您了解張一鳴的成功秘訣,分析網絡安全行業的最新趨勢,并為計算…

深入剖析Nginx架構及其不同使用場景下的配置

一、Nginx 整體架構概覽 1. Nginx簡介 Nginx 是采用 C 語言 編寫的高性能 Web 服務器、反向代理服務器及郵件代理服務器,特點是:高并發、高可用、低內存占用、模塊化設計。 架構核心理念: Master-Worker 多進程模型 事件驅動(…

單元測試詳解

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 對于軟件測試,我們先按照開發階段來進行劃分,將軟件測試分為單元測試、集成測試、系統測試、驗收測試,下面我們來聊聊單元測試。…

四款好用的Windows虛擬打印機,文檔轉PDF

1,Microsoft Print To PDF 2,Foxit Reader PDF Printer 3,Adobe PDF 4,clawPDF 參考文檔: https://mp.weixin.qq.com/s/_mt4J2RwhqQE36DRAvc-Rg

《map和set的使用介紹》

引言: 上次我們學習了第一個高階數據結構—二叉搜索樹,趁熱打鐵,今天我們就再來學習兩個數據結構—map和set。 一:序列式容器和關聯式容器 前面我們已經接觸過STL中的部分容器如:string、vector、list、deque、arra…

PostgreSQL(二十六)分區表管理

目錄 一、分區表特點 1、概念: 2、好處: 3、特點: 二、范圍分區介紹 1、簡介 2、范圍分區實驗: 三、list分區介紹 1、簡介 2、list分區表實驗 四、hash分區介紹 1、簡介 2、hash分區表實驗 五、混合分區介紹 1、簡…

概率論中的生日問題,違背直覺?如何計算? 以及從人性金融的角度分析如何違背直覺的?

一、生日問題的概率計算:為何23人就有50%概率撞生日? 1. 問題背景與直覺矛盾 生日問題指:在n個人中,至少有兩人生日相同的概率超過50%時,n的最小值是多少? 直覺判斷:因一年有365天&#xff0c…

Qt for WebAssembly官方說明文檔

鏈接 Qt for WebAssembly | Qt 5.15

前端自主實現將vue頁面轉為pdf文件下載

1.vue 轉 PDF 在 Vue 項目中將 HTML 頁面轉換為 PDF 文件是一個常見需求,特別是在需要生成報告或打印頁面時。本文將介紹如何使用 html2canvas 和 jspdf 庫實現這一功能。 2.安裝依賴 首先,我們需要安裝兩個庫:html2canvas 和 jspdf 。可以…

TCP 堅持定時器詳解:原理、配置與最佳實踐?

一、TCP 堅持定時器基礎原理 1.1 堅持定時器的設計目的 TCP 堅持定時器 (TCP Persist Timer) 是 TCP 協議中用于處理接收窗口為零情況的重要機制,其核心設計目的是防止 TCP 連接在窗口更新 ACK 丟失時陷入死鎖狀態。當 TCP 連接的接收方通告一個窗口大小為 0 的 A…

大廠測開實習和小廠開發實習怎么選

先說選擇,這個可以百分百確定選大廠,title很重要。 要想弄清楚那個選擇對自己最有利,可以思考下實習的意義是什么? 實習無非就是給簡歷加分,拿到好offer,高薪offer。 那這就需要思考,簡歷怎么讓…

Unity中的urp和普通的標準渲染管線區別在哪

Unity中的URP(Universal Render Pipeline)與內置標準渲染管線(Built-in Render Pipeline)的區別深刻反映了Unity渲染技術的演進方向。以下從架構、性能、功能、工作流等多個維度進行深度分析: 1. 底層架構與設計哲學 標…

Vscode 編寫Markdown支持 plantuml書寫

1: 下載PlantUml 插件: 2: 安裝java https://www.oracle.com/java/technologies/downloads/ 3: 安裝Graphviz https://graphviz.org/download/ 4: 下載plantuml.jar https://plantuml.com/zh/download 5&…

設計模式(C++/Qt)-工廠模式

在軟件開發中,對象創建是基礎但關鍵的任務——工廠模式提供了一種優雅的解決方案,讓您的代碼擺脫硬編碼的依賴關系 一、為什么需要工廠模式? 在C/Qt開發中,我們經常面臨這樣的困境: 對象創建邏輯分散在代碼各處新增…

Pydantic 模型

本文將詳細介紹 Pydantic 模型 和 BaseModel 的核心概念,并通過實際代碼示例如何從零開始編寫自己的 Pydantic 模型。 1. Pydantic 是什么? Pydantic 是一個 Python 庫,主要用于: 數據驗證:確保輸入數據符合預期的類…

【Unity智能模型系列】MediaPipeUnityPlugin 實現人臉數據獲取

目錄 一、MediaPipeUnity 簡介 二、MediaPipeUnity 的核心組成 1. Graph 構建系統 2. 解決方案類(Solution) 3. 解釋注釋Annotation 系統 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection圖形人臉檢測 2、案例 Face Detection圖形人臉檢…

iOS App 上架步驟解析:適合資源有限團隊的上架流程與注意事項

對于不少創業型或初創階段的開發團隊來說,人員配置緊湊、設備有限是常態。在這種背景下,完成一次合規、高效的iOS應用發布往往不是技術難點,而是流程協同與資源調配的問題。 我們是一支5人團隊,開發一款社交類工具型App&#xff…

Redis雪崩、穿透、擊穿原理及解決方案

以下是 Redis 緩存穿透、擊穿與雪崩的原理及解決方案的深度解析,結合工業級實踐整理: 🔍 ?一、問題原理與區別? ?問題類型??觸發條件??核心特征??危害??緩存穿透?查詢?不存在的數據?繞過緩存直擊數據庫,導致無效查…

DFX 動態重構的概念和實現

DFX 動態重構的概念和實現 背景介紹 本文內容當前僅限于XILINX或者和XILINX具有相同結構的FPGA器件。 FPGA 技術提供了在現場進行編程和重新編程的靈活性,而無需通過重新制造流程來實現設計修改。動態功能交換(Dynamic Function eXchange, DFX&#x…

hutool 導出數據報錯:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 導出報錯 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…