1. 程式人生 > >Cookie和Token

Cookie和Token

前言

本文將首先概述基於cookie的身份驗證方式和基於token的身份驗證方式,在此基礎上對兩種驗證進行比較。
最後將介紹JWT(主要是翻譯官網介紹)。

概述

HTTP是一個“無狀態”協議,這意味著Web應用程式伺服器在響應客戶端請求時不會將多個請求連結到任何一個客戶端。然而,許多Web應用程式的安全和正常執行都取決於系統能夠區分使用者並識別使用者及其許可權。

這就需要一些機制來為一個HTTP請求提供狀態。它們使站點能夠在會話期間對各使用者做出適當的響應,從而保持跟蹤使用者在應用程式中的活動(請求和響應)。

cookie和token

下面兩圖大致展示了基於cookie和基於token工作流程。

cookie工作流程
cookie工作流程 token工作流程
token工作流程

基於cookie的身份驗證

cookie是源自站點並由瀏覽器儲存在客戶計算機上的簡單檔案。它們通常包含一個名稱和一個值,用於將客戶端標識為對站點具有特定許可權的特定使用者。

cookie與源域相連線的方式可以確保僅源域能夠訪問其中儲存的資訊。第三方伺服器既不能讀取也不能更改使用者計算機上該域的cookie內容。

網景公司的前僱員於1993年發明了cookie。

基於cookie的驗證是有狀態的,就是說驗證或者會話資訊必須同時在客戶端和服務端儲存。這個資訊服務端一般在資料庫中記錄,而前端會儲存在cookie中。

驗證的一般流程如下:

  1. 使用者輸入登陸憑據;
  2. 伺服器驗證憑據是否正確,並建立會話,然後把會話資料儲存在資料庫中;
  3. 具有會話id的cookie被放置在使用者瀏覽器中;
  4. 在後續請求中,伺服器會根據資料庫驗證會話id,如果驗證通過,則繼續處理;
  5. 一旦使用者登出,服務端和客戶端同時銷燬該會話。

基於token的身份驗證

隨著單頁面應用程式的流行,以及Web API和物聯網的興起,基於token的身份機制越來越被大家廣泛採用。

當討論基於token的身份驗證時,一般都是說的JSON Web Tokens(JWT)。雖然有著很多不同的方式實現token,但是JWT已經成為了事實上的標準,所以後面會將JWT和token混用。

基於token的驗證是無狀態的。伺服器不記錄哪些使用者已登陸或者已經發布了哪些JWT。對伺服器的每個請求都需要帶上驗證請求的token。該標記既可以加在header中,可以在POST請求的主體中傳送,也可以作為查詢引數傳送。

工作流程如下:

  1. 使用者輸入登陸憑據;
  2. 伺服器驗證憑據是否正確,然後返回一個經過簽名的token;
  3. 客戶端負責儲存token,可以存在local storage,或者cookie中;
  4. 對伺服器的請求帶上這個token;
  5. 伺服器對JWT進行解碼,如果token有效,則處理該請求;
  6. 一旦使用者登出,客戶端銷燬token。

token相對cookie的優勢

無狀態

基於token的驗證是無狀態的,這也許是它相對cookie來說最大的優點。後端服務不需要記錄token。每個令牌都是獨立的,包括檢查其有效性所需的所有資料,並通過宣告傳達使用者資訊。

伺服器唯一的工作就是在成功的登陸請求上籤署token,並驗證傳入的token是否有效。

防跨站請求偽造(CSRF)

舉個CSRF攻擊的例子,在網頁中有這樣的一個連結
![](http://bank.com?withdraw=1000&to=tom),假設你已經通過銀行的驗證並且cookie中存在驗證資訊,同時銀行網站沒有CSRF保護。一旦使用者點了這個圖片,就很有可能從銀行向tom這個人轉1000塊錢。

但是如果銀行網站使用了token作為驗證手段,攻擊者將無法通過上面的連結轉走你的錢。(因為攻擊者無法獲取正確的token)

多站點使用

cookie繫結到單個域。foo.com域產生的cookie無法被bar.com域讀取。使用token就沒有這樣的問題。這對於需要向多個服務獲取授權的單頁面應用程式尤其有用。

使用token,使得用從myapp.com獲取的授權向myservice1.com和myservice2.com獲取服務成為可能。

支援移動平臺

好的API可以同時支援瀏覽器,iOS和Android等移動平臺。然而,在移動平臺上,cookie是不被支援的。

效能

一次網路往返時間(通過資料庫查詢session資訊)總比做一次HMACSHA256計算的Token驗證和解析要費時得多。

JWT

JWT是JSON Web Token的縮寫。它定義了一種緊湊且獨立的方式,用於將各方之間的資訊保安地傳輸為JSON物件。這是一個開放的標準,見RFC 7519

基於JWT的資訊可以通過數字簽名進行校驗。校驗的方法即可以使用訊息摘要(HMAC),或者非對稱加密(RSA)。

JWT具有兩個特點:

  1. 緊湊。由於其較小的尺寸,JWT可以通過URL,POST引數或者HTTP頭髮送。較小的尺寸會帶來傳輸速度的優勢;
  2. 自包含:token中包含了使用者的所有必須資訊,避免了多次查詢資料庫的需要。

應用場景

以下是JWT有用的一些場景

  1. 驗證:這是JWT最常用的場景。一旦使用者登陸成功,每個後續的請求將包括JWT,伺服器在對JWT進行驗證後,允許使用者訪問服務和資源。單點登陸是一個廣泛使用JWT的場景,因為它的開銷相對較小,並且能夠在不同的域中輕鬆使用。
  2. 資訊交換:JWT是在可以安全地傳輸資訊。因為JWT可以被簽名,收信人可以確認發信人的身份,同時也能夠驗證內容是否被篡改。

格式

JWT包括三個部分:頭部、載荷和簽名,這三個部分通過.連線起來。

因此,一個典型的JWT長這樣xxxxx.yyyyy.zzzzz

頭部

頭部通常包括兩部分:token型別(JWT),和使用到的演算法,如HMAC、SHA256或RSA,下面是一個例子,說明這是一個JWT,使用的簽名演算法是HS256。

{
  "alg": "HS256",
  "typ": "JWT"
}

頭部會通過Base64Url編碼形成JWT的第一部分

載荷

第二部分是載荷,要傳遞出去的宣告,其中包含了實體(通常是使用者)和附加元資料。有三種類型的宣告:

  • 保留宣告:這是一組預定義的宣告,非強制性,用來幫助接收方(伺服器)更好地理解這個JWT。其中包括:iss(issuer,該JWT的簽發者),exp(expiration time,過期時間),sub(subject,該JWT所面向的使用者),aud(audience,JWT的接收者),和另外一些宣告
  • 公共宣告:這些可以用使用JWT的人隨意定義。但是為了避免衝突,應在在IANA JSON WEB令牌登錄檔中定義它們,或者將其定義為包含防衝突名稱空間的URI。
  • 私有宣告:這些是為了在同意使用它們的各方之間共享資訊而建立的自定義宣告。

下面是一個例子

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

載荷會通過Base64Url編碼形成JWT的第二部分

簽名

將上面兩部分編碼後,使用.連線在一起,形成了xxxxx.yyyyyy。

最後,採用頭部指定的演算法,和私鑰對上面的字串進行簽名。

加入採用的是HMAC SHA256 演算法,簽名將通過下面的方式生成

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

該簽名使用者驗證JWT傳送者的身份,並確保該訊息沒有被篡改。

JWT工作流程

在身份驗證過程中,一旦使用者使用其憑據成功登陸,伺服器將返回JWT,該JWT必須在客戶端本地儲存。這和伺服器建立會話並返回cookie的傳統方法不同。

每次使用者要請求受保護的資源時,必須在請求中帶上JWT。通常在AuthorizationBearer中,如下:

Authorization: Bearer <token>

這是一種無狀態的認證機制,因為使用者狀態永遠不會儲存在伺服器記憶體中。伺服器的受保護路由將在授權頭中檢查有效的JWT,如果存在,則允許使用者訪問受保護的資源。由於JWT是自說明的,包含了所有必要的資訊,這就減少了多次查詢資料庫的需要。

這樣可以完全依賴無狀態的資料API,甚至可以向下遊服務發出請求。API的作用域並不重要,因此跨源資源共享(CORS)不會是一個問題,因為它不使用Cookie。

整個流程如下圖:


使用JWT的理由

現在來談談JWT與簡單網頁令牌(SWT)和安全斷言標記語言令牌(SAML)相比的優勢。

由於JSON比XML更短小,編碼時其大小也較小,使得JWT比SAML更緊湊。這使得JWT成為在HTML和HTTP環境中能更快地傳遞。

從安全形度來說,SWT只能通過使用HMAC演算法的共享金鑰進行對稱簽名。但是,JWT和SAML令牌可以以X.509證書的形式使用公鑰/私鑰對進行簽名。與簡單的JSON簽名相比,使用XML數字簽名簽名XML而不引入模糊的安全漏洞是非常困難的。

JSON解析器在大多數程式語言中很常見,因為它們直接對映到物件。相反,XML沒有自然的文件對物件對映。這使得使用JWT比SAML斷言更容易。

從使用平臺來說,JWT在Internet規模上使用。這突出了客戶端處理多個平臺上特別是移動平臺上的JSON Web令牌的便利性。

相關推薦

session-cookie token登入驗證

最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多網站的認證方式都從傳統的seesion+cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。 傳統的session+cookie身份驗證 由於HTTP是無狀態的,它並不記錄使

JWT與cookietoken的區別,django中使用

一. cookie A) cookie如何認證 1. 使用者輸入使用者名稱與密碼,傳送給伺服器。 2. 伺服器驗證使用者名稱和密碼,正確的就建立一個會話(session),同時會把這個會話的ID儲存到客戶端瀏覽器中,因為儲存的地方是瀏覽器的cookie,所以這種認證方式叫做基於cookie

CookieToken

前言 本文將首先概述基於cookie的身份驗證方式和基於token的身份驗證方式,在此基礎上對兩種驗證進行比較。 最後將介紹JWT(主要是翻譯官網介紹)。 概述 HTTP是一個“無狀態”協議,這意味著Web應用程式伺服器在響應客戶端請求時不會將多個請求連結到任何一個客戶端。然而,許多Web應用程式的安全和正

TokenCookieSession的區別

最簡 對稱 請求 應用 一次 會有 程序 隨機 uid 服務器端不存token,而存設備ID、登錄時時間戳、userID等。 服務器端使用存儲信息生成token,與會話token比較完成鑒權。 在做接口測試時,經常會碰到請求參數為token的類型,但是可能大部分測試人員

cookie、sessiontoken

aio 一個用戶 核心 選擇 uil img 做的 它的 blank https://zhuanlan.zhihu.com/p/25495290?utm_source=wechat_session&utm_medium=social 一、cookie   眾所周

IM開發基礎知識補課(四):正確理解HTTP短連線中的Cookie、SessionToken

1、前言 眾所周之,IM是個典型的快速資料流交換系統,當今主流IM系統(尤其移動端IM)的資料流交換方式都是Http短連線+TCP或UDP長連線來實現。Http短連線主要用於從伺服器讀取各種持久化資訊:比如使用者資訊、聊天曆史記錄、好友列表等等,長連線則是用於實時的聊天訊息

cookie、sessiontoken區別

cookie 和 session 眾所周知,HTTP 是一個無狀態協議,所以客戶端每次發出請求時,下一次請求無法得知上一次請求所包含的狀態資料,如何能把一個使用者的狀態資料關聯起來呢? 比如在淘寶的某個頁面中,你進行了登陸操作。當你跳轉到商品頁時,服務端如何知道你是已經登

WEB後臺--基於Token的WEB後臺登入認證機制(並講解其他認證機制以及cookiesession機制)

繼續這一個系列,基於Token的WEB後臺登入認證機制(並講解cookie和session機制)。每個後端不得不解決的認證問題。 本系列: 文章結構:(1)JWT(一種基於 token 的認證方案)介紹並介紹其他幾大認證機

基於Token的WEB後臺登入認證機制(並講解其他認證機制以及cookiesession機制)

幾種常用的認證機制 HTTP Basic Auth HTTP Basic Auth簡單點說明就是每次請求API時都提供使用者的username和password,簡言之,Basic Auth是配合RESTful API 使用的最簡單的認證方式,只需提供使用者

關於模擬登陸的小結-抓包、cookie、sessiontoken

概述 上個星期根據bcloud寫了個Java版本的登陸專案。其實本來時想做個Linux的百度雲登陸軟體,但是做到獲取bdstoken的時候出了問題解決不了。後來我把bcloud專案下了下來用發現也有問題,應該是百度登陸的過程有了一些改動。通過 web抓包找到一些線索,

Cookie、SessionToken的區別

目錄 Cookie Session認證機制 Token認證機制 Token預防CSRF Session認識和Token認證的區別 前言:HTTP是一種無狀態的協議,為了分辨連結是誰發起的,需要瀏覽器自己去解決這個問題。不然有些情況下即使是開啟同一個網站的不同頁面也

TokenCookieSession的區別--學習筆記

https://blog.csdn.net/qq_29347295/article/details/78112951 在做介面測試時,經常會碰到請求引數為token的型別,但是可能大部分測試人員對token,cookie,session的區別還是一知半解。為此我查閱大量的資料做了如下總結。&nb

cookie、sessiontoken那些事

cookie 和 session 眾所周知,HTTP 是一個無狀態協議,所以客戶端每次發出請求時,下一次請求無法得知上一次請求所包含的狀態資料,如何能把一個使用者的狀態資料關聯起來呢? 比如在淘寶的某個頁面中,你進行了登陸操作。當你跳轉到商品頁時,服務端如何知道你是已經登陸

一篇文章弄懂cookie、sessiontoken

概念 cookie cookie儲存在客戶端,HTTP是無狀態的,HTTP每次發出的時候會附上該域名下的cookie,從而可以給HTTP附上狀態,最常見的就是登入態。 session和token session和token算是一類的,他們是兩種不同的伺服器的驗證

Cookie,SessionToken機制區別.

1.背景介紹 由於HTTP是一種無狀態協議,伺服器沒有辦法單單從網路連線上面知道訪問者的身份,為了解決這個問題,就誕生了Cookie Cookie實際上是一小段的文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發一個C

cookie session 的區別詳解

重復 處理方式 一行 所有 有效 依據 是把 存儲 一個 二者的定義: 當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的

CookieJS購物車的簡單實例

html javascript css cookie shopping cart 最近學原生的Javascript,需要弄個購物車的功能,下面是利用cookie做的一個演示思路其實很簡單,商品界面通過value獲取對應的值,然後把這個商品的各種信息放入一個字典;因為有多個商品,把這些商品的

Python之路66-Django中的CookieSession

python目錄一、Cookie二、Session一、Cookie1.獲取Cookie request.COOKIES["key"] request.get_signed_cookie(key, default=RAISE_ERROR, s, max_age=None) # 參數 # default:默認

微信公眾開發URLtoken填寫詳解

res wrap this true 進行 -m tmp sem 知識 微信公眾開發URL和token填寫詳解 方法/步驟 作為一名微信公眾號開發者,別人進入你的微信公眾號,肯定會看見某些網頁,或者給你發某些信息,你需要實時自動回復,所以你

Cookiesession

存在 購物車 自動 名稱 () 內存 request 標識 基於 1.會話定義:打開瀏覽器瀏覽某一個網站--多次請求--瀏覽器關閉這個過程稱之為會話。2.B 瀏覽器 /S 服務器 2.1.瀏覽器端的會話技術:cookie JAVA(Cookie)