JWT 簡介

JWT是一種用于雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規范。JWT作為一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用于通信雙方之間以Json對象的形式安全的傳遞信息。因為數字簽名的存在,這些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘鑰對進行簽名。

  • 簡潔(Compact): 可以通過URL,POST參數或者在HTTP header發送,因為數據量小,傳輸速度也很快

  • 自包含(Self-contained):負載中包含了所有用戶所需要的信息,避免了多次查詢數據庫

JWT的主要應用場景

  • 身份認證
    在這種場景下,一旦用戶完成了登陸,在接下來的每個請求中包含JWT,可以用來驗證用戶身份以及對路由,服務和資源的訪問權限進行驗證。由于它的開銷非常小,可以輕松的在不同域名的系統中傳遞,所有目前在單點登錄(SSO)中比較廣泛的使用了該技術。

  • 信息交換
    在通信的雙方之間使用JWT對數據進行編碼是一種非常安全的方式,由于它的信息是經過簽名的,可以確保發送者發送的信息是沒有經過偽造的。

JWT的結構

JWT包含了使用.分隔的三部分:

  • Header 頭部

  • Payload 負載

  • Signature 簽名

其結構看起來是這樣的

xxxxx.yyyyy.zzzzz

Header

在header中通常包含了兩部分:token類型和采用的加密算法。

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

接下來對這部分內容使用 Base64Url 編碼組成了JWT結構的第一部分。

Payload

Token的第二部分是負載,它包含了claim, Claim是一些實體(通常指的用戶)的狀態和額外的元數據,有三種類型的claim: reserved, publicprivate.

  • Reserved claims: 這些claim是JWT預先定義的,在JWT中并不會強制使用它們,而是推薦使用,常用的有 iss(簽發者), exp(過期時間戳), sub(面向的用戶), aud(接收方), iat(簽發時間)

  • Public claims:根據需要定義自己的字段,注意應該避免沖突

  • Private claims:這些是自定義的字段,可以用來在雙方之間交換信息

負載使用的例子:

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

上述的負載需要經過Base64Url編碼后作為JWT結構的第二部分。

Signature

創建簽名需要使用編碼后的header和payload以及一個秘鑰,使用header中指定簽名算法進行簽名。例如如果希望使用HMAC SHA256算法,那么簽名應該使用下列方式創建:

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

簽名用于驗證消息的發送者以及消息是沒有經過篡改的。

完整的JWT

JWT格式的輸出是以.分隔的三段Base64編碼,與SAML等基于XML的標準相比,JWT在HTTP和HTML環境中更容易傳遞。

下列的JWT展示了一個完整的JWT格式,它拼接了之前的Header, Payload以及秘鑰簽名:

如何使用JWT?

在身份鑒定的實現中,傳統方法是在服務端存儲一個session,給客戶端返回一個cookie,而使用JWT之后,當用戶使用它的認證信息登陸系統之后,會返回給用戶一個JWT,用戶只需要本地保存該token(通常使用local storage,也可以使用cookie)即可。

當用戶希望訪問一個受保護的路由或者資源的時候,通常應該在Authorization頭部使用Bearer模式添加JWT,其內容看起來是下面這樣:

Authorization: Bearer <token>

因為用戶的狀態在服務端的內存中是不存儲的,所以這是一種無狀態的認證機制。服務端的保護路由將會檢查請求頭Authorization中的JWT信息,如果合法,則允許用戶的行為。由于JWT是自包含的,因此減少了需要查詢數據庫的需要。

JWT的這些特性使得我們可以完全依賴其無狀態的特性提供數據API服務,甚至是創建一個下載流服務。因為JWT并不使用Cookie的,所以你可以使用任何域名提供你的API服務而不需要擔心跨域資源共享問題(CORS)。

下面的序列圖展示了該過程:

為什么要使用JWT?

相比XML格式,JSON更加簡潔,編碼之后更小,這使得JWT比SAML更加簡潔,更加適合在HTML和HTTP環境中傳遞。

在安全性方面,SWT只能夠使用HMAC算法和共享的對稱秘鑰進行簽名,而JWT和SAML token則可以使用X.509認證的公私秘鑰對進行簽名。與簡單的JSON相比,XML和XML數字簽名會引入復雜的安全漏洞。

因為JSON可以直接映射為對象,在大多數編程語言中都提供了JSON解析器,而XML則沒有這么自然的文檔-對象映射關系,這就使得使用JWT比SAML更方便。

轉載于:https://www.cnblogs.com/hanxue112253/p/8542336.html

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

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

相關文章

FFMPEG的詳細資料可以在它的官方網站上找到

請看官網的文檔欄目: http://ffmpeg.mplayerhq.hu/documentation.html FFmpeg System Documentation Frequently Asked QuestionsFFmpeg program documentationffserver documentationffplay documentationvideo hook documentationsample ffserver configuration fileFFmpeg A…

空指針入棧問題

空指針和數據元素一樣能夠進棧。并且如果棧原來為空&#xff0c;壓入空指針后棧就不會為空了。空指針一旦被賦予指針&#xff0c;如果是在32位機上則占四個字節。只不過是沒有指向堆內存中的任何數據。而空指針已經壓進棧了&#xff0c;不加以釋放就一直存在。

arm linux 中斷 分析,armlinux中斷異常的處理分析.pdf

基于 ARM Linux 中斷、異常的處理分析本文是基于ARM S3C2410X 系統的Linux 2.6 中斷、異常和系統調用的處理分析。主要有以下幾個部分&#xff1a;1. ARM 的硬件中斷機制2. Linux 2.6 對 ARM 中斷向量表的初始化3. Linux 2.6 對 ARM 中斷、異常的處理(從匯編-->C 語言函數&a…

(數據科學學習手札03)Python與R在隨機數生成上的異同

隨機數的使用是很多算法的關鍵步驟&#xff0c;例如蒙特卡洛法、遺傳算法中的輪盤賭法的過程&#xff0c;因此對于任意一種語言&#xff0c;掌握其各類型隨機數生成的方法至關重要&#xff0c;Python與R在隨機數底層生成上都依靠梅森旋轉&#xff08;twister&#xff09;來生成…

音視頻編解碼知識學習詳解(分多部分進行詳細分析)

1. 常用的基本知識 基本概念 編解碼 編解碼器&#xff08;codec&#xff09;指的是一個能夠對一個信號或者一個數據流進行變換的設備或者程序。這里指的變換既包括將信號或者數據流進行編碼&#xff08;通常是為了傳輸、存儲或者加密&#xff09;或者提取得到一個編碼流的操作…

二叉樹非遞歸后序遍歷算法

與正常的非遞歸中序遍歷算法不同于兩點&#xff1a; 一 比正常的中序遍歷算法多了對數據元素的標記。 在壓數據元素入棧&#xff08;標記記為0&#xff0c;用來表示訪問了其左子樹&#xff09;時標記&#xff0c; 還有訪問完左子樹利用gettop&#xff08;&#xff09;獲取雙親…

SQL*Plus命令

SQL*Plus命令 前言 一&#xff1a;SQL*Plus 與數據庫的交互 二&#xff1a;設置SQL* Plus的運行環境 二 - 1 &#xff1a;SET命令概述 二 - 2 &#xff1a;使用SET命令設置運行環境 二 - 2 ____1&#xff1a;Pagesize 變量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像&#xff0c;但是Redis支持的數據存儲類型比Memcached更豐富&#xff0c;包括strings&#xff08;字符串&#xff09;、lists&…

C語言數碼管是共陰共陽程序,C語言實現共陰極數碼管操作

共陰極或者共陽極數碼管&#xff0c;因為其需要電流大&#xff0c;而一般51輸出電流低&#xff0c;需要鎖存器。買的開發板使用的共陰極數碼管。至于其構造&#xff0c;找個相關方面的書看看&#xff0c;這里主要是對做好的電路板進行編程。剛開始的時候&#xff0c;感覺在數碼…

數據庫主要特點

(1)實現數據共享。數據共享包含所有用戶可同時存取數據庫中的數據&#xff0c;也包括用戶可以用各種方式通過接口使用數據庫&#xff0c;并提供數據共享。 (2)減少數據的冗余度。同文件系統相比&#xff0c;由于數據庫實現了數據共享&#xff0c;從而避免了用戶各自建立應用文…

百度與華為全面戰略合作 人工智能手機真的要來了

視頻加載中...12月21日百度和華為在北京宣布達成全面戰略合作。這次合作內容主要包括三點&#xff0c;首先是在語音、語義、視覺和VR上的自然交互&#xff0c;這是百度為華為手機AI賦能的基礎層。第二是基于華為HiAI平臺和百度PaddlePaddle深度學習框架&#xff0c;共建人工智能…

JavaScript數據類型

一、JavaScript數據類型主要分為原始類型和引用數據類型。 原始類型包括(不可拆分的東西)&#xff1a;Number、String、Boolean、Null、Undefined。引用數據類型包括&#xff1a;Object&#xff08;Array&#xff0c;Date&#xff0c;RegExp&#xff0c;Function&#xff09;ty…

funcode拼圖游戲c語言程序,同求funcode平臺下拼圖游戲的C語言代碼

做了好幾天&#xff0c;寫了好多回就是不對&#xff0c;徹底崩潰。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…

什么是透明傳輸

透明傳輸是指不管所傳數據是什么樣的比特組合&#xff0c;都應當能夠在鏈路上傳送。當所傳數據中的比特組合恰巧與某一個控制信息完全一樣時&#xff0c;就必須采取適當的措施&#xff0c;使收方不會將這樣的數據誤認為是某種控制信息。這樣才能保證數據鏈路層的傳輸是透明的。…

Android 秒級編譯FreeLine

項目地址&#xff1a;FreeLine FreeLine官網: FreeLine 1. 安裝FreeLine插件 File->Settings->Plugins, 搜索輸入FreeLine Plugin, 查找到后進行安裝并重啟Android Studio。 圖1.png安裝好之后&#xff0c;在工具欄就會出一個圖標 圖2.png2. 配置gradle 根目錄build.gr…

JS實現大整數乘法(性能優化、正負整數)

本方法的思路為&#xff1a; 一&#xff1a;檢查了輸入的合法性&#xff08;非空&#xff0c;無非法字符&#xff09; 二&#xff1a;檢查輸入是否可以進行簡單計算&#xff08;一個數為 0&#xff0c;1&#xff0c;1&#xff0c;-1&#xff09; 三&#xff1a;去掉輸入最前面可…

c語言中- gt he,C語言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分別是什么意思

fabs 編輯本段C語言數學函數:fabs 函數簡介  原型&#xff1a;在TC中原型是extern float fabs(float x);&#xff0c;在VC6.0中原型是double fabs( double x );。   用法&#xff1a;#include   功能&#xff1a;求浮點數x的絕對值   說明&#xff1a;計算|x|, 當x不為…

物理層

目的&#xff1a; 物理層要盡可能地屏蔽掉物理設備和傳輸媒體&#xff0c;通信手段的不同&#xff0c;使數據鏈路層感覺不到這些差異&#xff0c;只考慮完成本層的協議和服務。 給其服務用戶&#xff08;數據鏈路層&#xff09;在一條物理的傳輸媒體上傳送和接收比特流…

C語言中的二級指針(雙指針)

二級指針又叫雙指針。C語言中不存在引用&#xff0c;所以當你試圖改變一個指針的值的時候必須使用二級指針。C中可以使用引用類型來實現。 下面講解C中的二級指針的使用方法。 例如我們使用指針來交換兩個整型變量的值。 錯誤代碼如下&#xff1a; 一級指針 [cpp] view pla…

測試環境服務器硬盤塞滿問題排查

項目中出現的問題 某天下午測試環境服務器出現tab無法補全命令&#xff0c;給出的提示大概意思就是說,無可用空間無法創建臨時文件&#xff0c;不過這次跟上次出現的問題比較像&#xff0c;上次服務器出現的問題&#xff0c;因此樓主判斷可能是服務器數據盤被占滿&#xff0c;果…