大模型中常說的Token到底是什么?和Cookie和Session有什么區別?一文講清

什么是Token(令牌)

Acesss Token是訪問資源接口(API)時所需要的資源憑證

簡單token的組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以哈希算法壓縮成的一定長度的十六進制字符串)

特點:

  • 服務端無狀態化、可擴展性好
  • 支持移動端設備
  • 安全
  • 支持跨程序調用

token的身份驗證流程:

  1. 客戶端使用用戶名跟密碼請求登錄
  2. 服務端收到請求,去驗證用戶名與密碼
  3. 驗證成功后,服務端會簽發一個token并把這個token發送給客戶端
  4. 客戶端收到token以后,會把它存儲起來,比如放在cookie里或者localStorage里
  5. 客戶端每次向服務端請求資源的時候需要帶著服務端簽發的token
  6. 服務端收到請求,然后去驗證客戶端請求里面帶著的token,如果驗證成功,就向客戶端返回請求的數據

每一次請求都需要攜帶token,需要把token放到HTTP的Header里。基于token的用戶認證是一種服務端無狀態的認證方式,服務端不用存放token數據。用解析token的計算時間換取session的存儲空間,從而減輕服務器的壓力,減少頻繁的查詢數據庫。

另外還有一種token——refresh token,它是專用于刷新access token的token。如果沒有refresh token,也可以刷新access token,但每次刷新都要用戶輸入登錄用戶名與密碼,會很麻煩。有了refresh token,可以減少這個麻煩,客戶端直接用refresh token去更新access token,無需用戶進行額外的操作。Access Token的有效期比較短,當Acesss Token由于過期而失效時,使用Refresh Token就可以獲取到新的Token,如果Refresh Token也失效了,用戶就只能重新登錄了。Refresh Token及過期時間是存儲在服務器的數據庫中,只有在申請新的Acesss Token時才會驗證,不會對業務接口響應時間造成影響,也不需要向Session一樣一直保持在內存中以應對大量的請求。

舉個例子簡單理解一下:

假設你去健身房鍛煉:

Access Token 就像健身房的「單次門禁卡」,有效期1小時(短期有效)。有了它,你能進入健身房使用各種器材。

Refresh Token 就像「補辦門禁卡的憑證」,有效期30天(長期有效)。當「單次門禁卡」過期后,你不用重新辦卡(不用重新輸入賬號密碼登錄),直接用這個憑證就能免費換一張新的「單次門禁卡」。你第一次去健身房(首次登錄),前臺對你的身份(驗證賬號密碼),給你一張「單次門禁卡」(Access Token)和一張「補辦憑證」(Refresh Token)。而1小時后「單次門禁卡」過期了(Access Token失效):你不用再去前臺重新登記(不用重新登錄),直接出示「補辦憑證」(Refresh Token),前臺就會給你一張新的「單次門禁卡」(新的Access Token)。30天后「補辦憑證」也過期了(Refresh Token失效):這時你必須重新去前臺登記(重新登錄),才能拿到新的「門禁卡」和「補辦憑證」。

為什么需要這樣設計?

  • 如果只有Access Token且有效期很長:一旦被盜,別人可以長期冒用你的身份(不安全)。
  • 如果只有短期的Access Token且沒有Refresh Token:過期后需要頻繁重新登錄(體驗差)。
  • 有了Refresh Token:既保證了安全性(Access Token短期有效),又兼顧了便利性(不用頻繁登錄)。

Token和Cookie的區別

Cookie和Token雖然都能用于身份驗證,但兩者的設計邏輯和適用場景差異顯著。Cookie 是互聯網早期的產物,存在一些歷史遺留問題,而Token更能適應現代Web開發的復雜需求,因此兩者并非替代關系,而是根據場景互補使用。

Cookie是HTTP協議自帶的狀態傳遞工具,由瀏覽器自動存儲和發送,默認與特定域名綁定,存在跨域限制,且容易因自動發送的特性帶來CSRF等安全風險,存儲容量也被限制在4KB左右,更適合簡單的本地狀態存儲(如用戶偏好)。而Token是服務器生成的加密令牌,完全由開發者控制存儲位置(如localStorage、內存)和發送方式(如請求頭),不受跨域限制,也不會被瀏覽器自動攜帶,能避免Cookie的默認行為帶來的安全隱患,且可承載更多信息,更適合前后端分離、跨域API調用、移動端應用等場景。

Token和Session的區別

首先理解一下什么是Session:Session 是一種讓服務器能夠記錄客戶端(比如瀏覽器)會話狀態的機制。當用戶第一次訪問服務器時,服務器會為這個用戶創建一個獨特的 Session,里面可以存儲一些和該用戶相關的信息,比如登錄狀態、購物車內容等。同時,服務器會生成一個對應的 SessionID,并通過 Cookie 等方式發送給客戶端。之后,客戶端每次向服務器發送請求時,都會帶上這個 SessionID。服務器通過識別 SessionID,就能找到對應的 Session,從而知道這是哪個用戶的請求,以及該用戶之前的會話狀態,這樣就實現了服務端的“有狀態”交互。

舉個例子,你登錄一個購物網站后,添加商品到購物車,這些操作記錄會被保存在服務器為你創建的 Session 里。當你刷新頁面或跳轉到其他頁面時,瀏覽器會自動帶上 SessionID,服務器通過它找到你的 Session,所以購物車里的商品不會消失,這就是 Session 在起作用。不過,Session 是存儲在服務器端的,這意味著如果服務器集群部署,需要考慮 Session 共享的問題,否則用戶切換到集群中的其他服務器時,可能會因為找不到對應的 Session 而需要重新登錄。

因而,Session是服務器用來記錄和客戶端之間會話狀態的一種機制,它能讓服務器處于有狀態化,也就是能記住會話中的各種信息。而Token是一種令牌,是訪問資源接口(API)時必須有的資源憑證,它能讓服務器處于無狀態的狀態,不會去存儲會話方面的信息。

Session和Token并不是相互沖突的。作為身份認證的方式,Token的安全性比Session更好,因為每一個請求都會帶有簽名,能夠防止被監聽以及重放攻擊,而Session則必須依靠鏈路層來保證通訊的安全。如果需要實現有狀態的會話,還是可以增加Session在服務器端保存一些狀態信息。

所謂的Session認證,其實就是簡單地把用戶信息存儲到Session里,由于SessionID難以預測,所以暫時可以認為它是安全的。而Token,如果指的是OAuth Token或者類似的機制,它能提供認證和授權功能,認證是針對用戶的,授權是針對應用程序的。它的目的是讓某個應用程序有權限訪問某個用戶的信息。這里的Token是唯一的,不能轉移到其他應用程序上,也不能轉到其他用戶那里。Session只提供一種簡單的認證,只要有了這個SessionID,就會被認為擁有該用戶的全部權限。SessionID需要嚴格保密,只能保存在網站自己這邊,不應該共享給其他網站或者第三方應用程序。所以簡單來說,如果用戶數據可能需要和第三方共享,或者允許第三方調用API接口,那就用Token。如果始終只是自己的網站、自己的應用程序,用哪種都沒什么關系。

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

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

相關文章

RAGFlow:檢索增強生成技術的高效實現與深度探索

在當今信息爆炸的時代,如何從海量的數據中快速、準確地獲取并利用有價值的信息,成為了眾多領域面臨的關鍵挑戰。檢索增強生成(Retrieval-Augmented Generation, RAG)技術應運而生,它將信息檢索與大型語言模型&#xff…

【軌物洞見】光伏逆變器數據:分布式電站價值回歸的“第一塊多米諾骨牌”

1. 逆變器:光伏電站的核心“數據心臟” 逆變器是將光伏組件產生的直流電轉換為交流電的關鍵設備,其性能直接影響著整個電站的效率與穩定性。對其電壓、電流、功率參數以及故障告警信息進行遠程數據采集,是實現精細化運維和預測性維護的起點。…

如何在 npm 上發布 Element Plus 二次封裝組件

在一次開發中,小李接到一個重要的任務:將 Element Plus 中的時間組件根據團隊的獨特需求進行二次封裝。他靈機一動,決定將這個自定義組件打包成一個 npm 包,以便團隊的其他小伙伴們可以快速、方便地使用。接下來,讓我們…

vue2使用v-viewer圖片預覽:打開頁面自動預覽,禁止關閉預覽,解決在微信瀏覽器的頁面點擊事件老是觸發預覽初始化的問題

1、安裝: npm install v-viewer viewerjs2、在 main.js 中全局注冊: import Viewer from v-viewer; import viewerjs/dist/viewer.css; Vue.use(Viewer ); //配置項(可選,根據需求調整) // Vue.use(Viewer, { // d…

開源 Arkts 鴻蒙應用 開發(八)多媒體--相冊和相機

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 Arkts …

無線通信資源分配相關算法

1.Maximum Clique First (MCF)是一種啟發式圖著色算法(heuristic graph coloring algorithm),它的核心思想是:優先為圖中最大團(maximum clique)中的頂點分配不同的顏色,然后再依次為其他頂點上…

Kafka監控體系搭建:基于Prometheus+JMX+Grafana的全方位性能觀測方案

為什么需要Kafka監控監控架構概述步驟一:部署JMX Exporter 1.1 下載JMX Agent1.2 創建指標暴露配置 步驟二:配置Kafka集成JMX 2.1 啟動參數配置2.2 驗證指標暴露 步驟三:配置Prometheus采集 3.1 修改Prometheus配置3.2 驗證數據采集 步驟四&a…

stack 和 queue

目錄 一、stack 1.1 stack 的介紹 1.2 stack的使用 1)最小棧 2)棧的彈出壓入序列 3)逆波蘭表達式求值 1.3 stack 的模擬使用 二、queue 2.1 queue的介紹 2.2 queue的使用 2.3 queue的模擬使用 三、容器適配器 3.1 什么是容器適配…

sqlsuger 子表獲取主表中的一個字段的寫法

在使用 SQL 語言進行數據庫操作時,如果你想要從子表獲取數據,同時關聯到主表中的一個字段,通常我們會使用 SQL 的 JOIN 語句。JOIN 語句允許你通過一個或多個共同的字段將兩個或多個表連接起來。這里我將展示幾種常見的 JOIN 類型&#xff08…

Docker配置Gitlab-runner實現自動化容器化部署前端項目

疊甲前言 本文僅作為個人學習GitLab的CI/CD功能記錄,不適合作為專業性指導,如有紕漏,煩請君指正。 云主機注冊Gitlab Runner 自動化構建部署的弊端 在前一文中,我們在Linux云主機上注冊了Gitlab-runner, 每次在gitlab流水線上發…

MySQL介紹和MySQL包安裝

文章目錄MySQL介紹和安裝1.MySQL介紹1.1 MySQL 的定義1.2 MySQL 的特點1.3 MySQL 的應用領域1.4 MySQL 的存儲引擎1.5 MySQL 的架構1.6 MySQL 的優勢和局限性1.7 MySQL 的未來發展趨勢2.MySQL安裝2.1 主機初始化2.1.1 設置網卡名2.1.2 設置ip地址2.1.3 配置鏡像源2.1.4 關閉防火…

J2EE模式---視圖助手模式

視圖助手模式基礎概念視圖助手模式(View Helper Pattern)是一種結構型設計模式,其核心思想是將視圖層中復雜的邏輯提取到獨立的助手類中,使視圖代碼更加簡潔、易于維護。視圖助手通常提供一系列工具方法,用于處理格式化…

開源的語音合成大模型-Cosyvoice使用介紹

1 模型概覽 CosyVoice 是由阿里巴巴達摩院通義實驗室開發的新一代生成式語音合成大模型系列,其核心目標是通過大模型技術深度融合文本理解與語音生成,實現高度擬人化的語音合成體驗。該系列包含初代 CosyVoice 及其升級版 CosyVoice 2.0,兩者…

深度學習·CLIP

CLIP 數據大小 4億個文本-圖像對,而且是高質量的 預訓練方法 Text encoder“The text sequence is bracketed with [SOS] and [EOS] tokens and the activations of the highest layer of the transformer at the [EOS] token are used as the feature representati…

美光MTFC8GAKAJCN-4M_IT型eMMC應用介紹

1.1 芯片訂購信息美光MTFC8GAKAJCN-4M_IT型eMMC,容量8GB,153-ball VFBGA封裝。1.2 eMMC料號含義2.1 特性?多媒體卡(MMC)控制器和NAND閃存?153球FBGA封裝(符合RoHS標準,環保封裝)?VCC&#xf…

面向對象分析與設計40講(6)設計原則之開閉原則

文章目錄 一、概念 二、示例(C++ 實現) 1. 違反開閉原則的示例 2. 遵循開閉原則的示例 一、概念 開閉原則(Open-Closed Principle,OCP)是面向對象設計中的重要原則,由 Bertrand Meyer 提出,核心思想可以概括為:對擴展開放,對修改關閉。 具體來說,一個軟件實體(如類…

[Linux入門] Linux 網絡設置入門:從查看、測試到配置全攻略

目錄 一、查看網絡信息&#xff1a;了解你的網絡狀態 1??核心工具&#xff1a;ip命令&#xff08;替代ifconfig&#xff09; <1> 基本語法&#xff1a; <2> 實用操作示例&#xff1a; 2??查看路由表&#xff1a;route命令 3??查看網絡連接狀態&#xf…

TyFlow:三維領域的粒子特效革命者

在動態模擬與視覺特效領域&#xff0c;??TyFlow?? 作為 3ds Max 中誕生的一款革命性粒子系統插件&#xff08;后來也支持獨立開發&#xff09;&#xff0c;正在徹底改變藝術家們創作復雜動力學效果的方式。它以其無與倫比的靈活性、強大的計算能力和開創性的技術理念&#…

本地一鍵部署 Spark-TTS,支持Mac和Windows

Spark-TTS是一個文本轉語音(TTS)的項目&#xff0c;零樣本語音克隆逼真&#xff0c;多語言支持&#xff0c;語音參數可控。使用魔當(LM Downloader)&#xff0c;可以實現Spark-TTS的本地一鍵部署。 注意 如果使用Windows&#xff0c;推薦用NVIDIA顯卡&#xff0c;生成速度較快…

傳統時間:Date日期類,SimpleDateFormat,Calendar

目錄DateSimpleDateFormatCalendarDate 代表的是日期和時間 常見構造器和方法&#xff1a; 構造器說明public Date()創建一個Date對象&#xff0c;代表的是系統當前此刻日期時間public Date(long time)把時間毫秒值轉換成Date日期對象 常見方法說明public long getTime()返…