JWT:擁有我,即擁有權力

Hi,這里是桑小榆。上篇文章中,我們一起探討了 OAuth 協議的原理以及授權認證流程,本次我們一起探討 jwt 令牌作為授權協議的傳輸介質。

OAuth協議規范了幾個參與角色的授權標準,安全可控的授予第三方應用,第三方應用獲取到用戶授予的權限之后,與資源服務器進行交互。那么在進行交互的時候,必然需要一種傳輸介質,且需要攜帶用戶身份的信息,使得服務器之間能夠識別并認證。這個傳輸的介質就是我們此次探討的 jwt。

jwt,全稱 Json Web Token,也就是日常說的 token 令牌。它是通過數字簽名的方式,以 json 對象為載體,在不同服務終端之間安全傳輸信息。

我們可以看到jwt的定義,它具有和 json 一樣的特性,非常輕量的傳輸方式,且易于人閱讀和編寫,利于機器的解析和生成。

它像我們的居民身份證一樣,一旦相關權威部門識別你是合法公民且會頒發一個適用于本土的證件,通過這個證件可以任意出入需要出示證件的地方。那么jwt也是一樣,在服務器認證你的合法用戶身份之后,會生成一個json對象,發送給用戶,例如:

{"姓名":?"桑小榆","角色":?"管理員","到期時間":?"2022年10月1日?10點10分"
}

之后,用戶每需要與服務器通訊的時候,攜帶具有身份信息的json。服務器完全只需要驗證用戶攜帶的身份信息。

當然,用戶信息不會以明文的方式攜帶,不然很容易被不法分子截獲進行篡改,那這個令牌就變得無意義了。但凡頒發任何具備流通的信息,都需要具備防偽標識。例如身份證,系統架構師資格證,人民幣等都具備復雜的防偽信息。

那 jwt 在生成的時候,通常是加上簽名來防止篡改的。形成一個標準的 jwt 格式如下:

0a130e031b1015b7310182758b661cea.png

▲圖/?jwt解析組成部分

我們可以看到左邊生生簽名之后的 jwt 格式是很長得一串字符組成,中間由(.)隔開分成三部分。

我們看到右邊解析之后,是jwt的組成格式。

Header?????頭部
Payload????載荷
Signature??簽名以上組成jwt格式為:Header.Payload.Signature

那么我們將依次探討這三部分。

Header頭部

header部分是一個json對象,描述jwt的一些元數據,也就是屬性信息。通常格式如下:

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

上面的代碼中,alg屬性表示采用簽名的算法(algorithm),默認是 hmac sha256,寫成 hs256。這里通常有幾種比較常用的簽名算法rs256,hs256,base64

rs256(帶有sha-256的 rsa 簽名)是一種非對稱算法,它使用公鑰/私鑰對:身份提供者擁有用于生成簽名的私鑰(秘密)密鑰,而 jwt 的消費者獲得公鑰驗證簽名。由于與私鑰相反,公鑰不需要保持安全,因此大多數身份提供者都可以讓消費者輕松獲取和使用(通常通過元數據 url)。

hs256(帶有 sha-256 的hmac)涉及散列函數和一個密鑰的組合,該密鑰在兩方之間共享,用于生成用作簽名的散列。由于生成簽名和驗證簽名都使用相同的密鑰,因此必須注意確保密鑰不被泄露。


typ屬性表示這個令牌(token)的類型(type),jwt 令牌統一寫為jwt

最后,將上面的 json 對象使用 base64url?算法轉成字符串。

Payload?載荷

payload 部分也是一個 json 對象,用來存放實際需要傳遞的數據,通常包含一些簽發的信息。jwt 規定了7個官方字段,供選用。

iss?(issuer):?jwt簽發者.sub?(subject):?jwt所面向的用戶.aud?(audience):?接收jwt的一方.exp?(expiration?time):?jwt的過期時間,這個過期時間必須要大于簽發時間.nbf?(Not?Before):?定義在什么時間之前,該jwt都是不可用的.iat?(Issued?At):?jwt的簽發時間.jti?(JWT?ID):?jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊.

當然除了官方定義的七種之外,還可以自己定義一些私有字段。例如上圖 jwt 格式中的 payload 格式,就是是自定義了一些私有字段。

{"sub":?"1234567890","name":?"桑小榆呀","iat":?1516239022

注意,jwt 默認是不加密的,任何人都可以讀到,所以不要把私密信息放在這個部分。所以,payload 部分要使用 base64url 算法轉成字符串。

Signature?簽名

signature 部分是對前header和payload的簽名,防止數據篡改。

首先,需要指定一個256位的密鑰(secret)。這個密鑰只有服務器才知道,不能泄露給用戶。然后,使用 header 里面指定的簽名算法(默認是 hmac?sha256),按照下面的公式產生簽名。

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

算出簽名以后,把 header、payload、signature 三個部分拼成一個字符串,每個部分之間用點(.)分隔,就可以返回給用戶。

Base64Url 算法

我們在上面的文章中也多次提到,header和payload部分需要使用base64url算法。base64url算法跟base64算法基本類似,但也有一些不同。

jwt作為一個token令牌,有些使用場景可能會用到url,例如 https://jwt.io/?token=xxx。加密流程首先會對url的明文進行加密,其次在base64加密的基礎上,會對url里面特殊字符進行處理:=被省略、+替換成-/替換成_?。這就是base64url加密算法。

JWT 使用

我們探討完了 jwt 的組成之后,回歸到使用上。在身份驗證中,客戶端使用身份憑據成功登錄時,將返回一個 Token 令牌。由于令牌是憑據,因此必須非常小心以防止出現安全問題。通常情況下不應該將令牌保留超過所需的時間。

ef5aad838b2105edd3c154e898723e10.png

雖然我們可以將Token存儲在Cookie和localStorage當中,進行自動發送。但會缺乏安全性,和跨域的問題。更好的做法是在authorization標頭中使用bearer模式。標頭的內容應如下所示:

Authorization:?Bearer?<token>

如果令牌在authorization標頭中發送,則跨域資源共享 (CORS) 不會成為問題,因為它不使用 cookie。配合https傳輸也能大大提高了安全性。

d79d8349119917c9eb737cf9bff691fc.png

▲圖/?jwt簡易授權流程

JWT 特點

最后我們總結 jwt 的幾個特點:

1. ?jwt 默認是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次。

2. jwt 不加密的情況下,不能將秘密數據寫入 jwt 。

3. jwt 不僅可以用于認證,也可以用于交換信息。有效使用 jwt ,可以降低服務器查詢數據庫的次數。

4. jwt 的最大缺點是,由于服務器不保存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 jwt 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。

5. jwt 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。為了減少盜用,jwt 的有效期應該設置得比較短。對于一些比較重要的權限,使用時應該再次對用戶進行認證。

6. 為了減少盜用,jwt 不應該使用 http 協議明碼傳輸,要使用 https 協議傳輸。

我們一起探討完了 jwt 相關知識。下篇我們將以代碼實操的方式來演示 jwt 的生成以及使用,并且配合 oidc 一套標準的授權流程。

👇?更多有趣內容,請多關注!👇

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

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

相關文章

雙十一到來之前,阿里AI設計師“魯班”1天能做4000萬張海報

相比較去年&#xff0c;“魯班”的設計技藝有所提升。 人工智能很大程度上便利了我們的生活&#xff0c;現在他們甚至還能取代了一些設計師的工作&#xff0c;在雙十一正式到來之前&#xff0c;淘寶的宣傳已經鋪天蓋地&#xff0c;然而很多人都沒想到&#xff0c;我們打開淘寶…

Appium移動自動化測試之獲取appPackage和appActivity

方法一&#xff1a;直接打開Appium,點擊左上角機器人圖標 選擇apk所在位置&#xff0c;如圖所示&#xff0c;這里以ContactManager.apk為例 方法二&#xff1a;利用dex2jar和jd-gui這兩個工具反編譯apk文件 這里仍以ContactManager.apk為例 (1)重命名ContactManager.apk為Conta…

CAD轉WPF: 關于CAD圖紙文件轉換為WPF矢量代碼文件(xaml文件)的技巧

前言&#xff1a;下面的文章&#xff0c;我將會以幾個很簡單的步驟&#xff0c;來演示一下通過CAD圖紙轉換為XAML代碼文件的方法&#xff0c;供大佬們參考。一、為了演示一個簡單的操作&#xff0c;我此處先打開一個空白的CAD&#xff0c;等下用來進行繪制點內容使用。二、自定…

python之新式類與經典類

經典類與新式類經典類:P 或 P()--深度查找&#xff0c;向上查父節點新式類 :P(object)---廣度查找&#xff0c;繼承object&#xff0c;新式類的方法較多轉載于:https://www.cnblogs.com/zyy98877/p/8574983.html

Flowportal-BPM——環境配置

環境配置&#xff1a; 一、控制面板→程序和功能→打開或不關閉Window功能→選擇選項 二、控制面板→管理工具→Internet信息服務&#xff08;IIS&#xff09;管理器→左側第一個→ISAPI和CGI限制→全部選為【允許】 三、控制面板→管理工具→Internet信息服務&#xff08;IIS&…

一篇文章帶你搞懂什么是DevOps?

DevOps DevOps 它的英文發音是 /de’v?ps/&#xff0c;類似于“迪沃普斯”&#xff0c;一詞本身是對于 development 以及 operation 兩個詞的混合&#xff0c;其目的在于縮短系統開發的生命周期&#xff0c;在這過程中發布特性、修復bug以及更新均被緊密的結合。 簡化的含義為…

iOS 時間戳的轉換

在開發iOS程序時&#xff0c;有時候需要將時間格式調整成自己希望的格式&#xff0c;這個時候我們可以用NSDateFormatter類來處理。例如&#xff1a; //實例化一個NSDateFormatter對象 NSDateFormatter *dateFormatter [[NSDateFormatter alloc] init]; //設定時間格式,這里可…

微服務架構下分布式事務解決方案 —— 阿里GTS

1 微服務的發展 微服務倡導將復雜的單體應用拆分為若干個功能簡單、松耦合的服務&#xff0c;這樣可以降低開發難度、增強擴展性、便于敏捷開發。當前被越來越多的開發者推崇&#xff0c;很多互聯網行業巨頭、開源社區等都開始了微服務的討論和實踐。Hailo有160個不同服務構成&…

重要消息丨.NET Core 3.1 將于今年12月13日結束支持

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;5分鐘).NET Core 3.1 將于 2022 年 12 月 13 日結束支持。此后&#xff0c;Microsoft 將不再為 .NET Core 3.1 提供服務更新或技術支持。我們建議盡快遷移到 .NET 6。如果您在支持日期結束后仍在使用 .NET Core 3.1&a…

產品設計的三大原則

1.它有用嗎? 如果我們必須從這三個特性中選擇一個作為最重要的&#xff0c;那就是有用性。 首要的是&#xff0c;一個產品必須有用。如果它無用&#xff0c;其它任何東西都是不相關的&#xff0c;因為沒有人會需要它。很明顯&#xff0c;有用性和可享用性看上去一樣重要&#…

常用的17個運維監控系統

1. Zabbix Zabbix 作為企業級的網絡監控工具&#xff0c;通過從服務器&#xff0c;虛擬機和網絡設備收集的數據提供實時監控&#xff0c;自動發現&#xff0c;映射和可擴展等功能。 Zabbix的企業級監控軟件為用戶提供內置的Java應用服務器監控&#xff0c;硬件監控&#xff0c…

關于html-三角的制作

因為最近看到別人寫的不錯的樣式&#xff0c;所以就想自己實現&#xff0c;但是呢用到了一個三角形&#xff0c;所以稍微研究一下。效果是這樣的&#xff1a;注意是下邊那個淺色三角&#xff0c;感覺書簽的效果有木有。看著很有層次感。接下來就是實現了&#xff0c;利用border…

ABP中的數據過濾器

本文首先介紹了ABP內置的軟刪除過濾器(ISoftDelete)和多租戶過濾器(IMultiTenant)&#xff0c;然后介紹了如何實現一個自定義過濾器&#xff0c;最后介紹了在軟件開發過程中遇到的實際問題&#xff0c;同時給出了解決問題的一個未必最優的思路。一.預定義過濾器ABP中的數據過濾…

ActiveMQ與spring整合

2019獨角獸企業重金招聘Python工程師標準>>> 1 生產者 第一步&#xff1a;引用相關的jar包。 <dependency> <groupId>org.springframework</groupId><artifactId>spring-jms</artifactId> </dependency> <dependency><…

最新遠程部署運維工具匯總

一&#xff0e;Puppet 轉載https://baike.baidu.com/item/puppet/5109503?fraladdin puppet是一種Linux、Unix、windows平臺的集中配置管理系統&#xff0c;使用自有的puppet描述語言&#xff0c;可管理配置文件、用戶、cron任務、軟件包、系統服務等。puppet把這些系統實體…

Kali Linux 2016.2初體驗使用總結

Kali Linux 2016.2初體驗使用總結Kali Linux官方于8月30日發布Kali Linux 2016的第二個版本Kali Linux 2016.2。該版本距離Kali Linux 2016.1版本發布&#xff0c;已經有7個月。在這期間&#xff0c;在Kali Linux 2016.2版本發布的這段時間&#xff0c;Kali Linux官方增補了94個…

Kafka入門教程:學習總結目錄索引

【Kafka】| 總結/Edison ZhouEdison總結了Kafka的學習征途系列&#xff0c;特意整理了一份目錄索引&#xff0c;希望對你有幫助。0Kafka學習路徑在學習Kafka的途中&#xff0c;我總結了一個系列的Kafka學習征途系列教程&#xff0c;它只選取了我認為最實用的部分整理出來&#…

javaweb學習中的路徑問題

1. 項目結構 2. 客戶端路徑 1. 超鏈接 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/…

步步為營-11-ListT泛型的簡單練習

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 集合簡單練習 {class Program{static void Main(string[] args){}private static void Test3(){//奇偶分揀,奇數在前偶數在后List<int>…

SPI 與 API的區別

背景 Java 中區分 API 和 SPI&#xff0c;通俗的講&#xff1a;API 和 SPI 都是相對的概念&#xff0c;他們的差別只在語義上&#xff0c;API 直接被應用開發人員使用&#xff0c;SPI 被框架擴展人員使用 理解 API &#xff08;Application Programming Interface&#xff09; …