0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是JWT?JWT由哪些部分組成?JWT如何進(jìn)行用戶認(rèn)證?

jf_uPRfTJDa ? 來源:移動Labs ? 2024-02-25 09:44 ? 次閱讀

Part 01

JWT是什么?

JWT(JSON Web Token)是一個開放的行業(yè)標(biāo)準(zhǔn)(RFC 7519),自身包含了身份驗證所需要的所有信息,因此我們的服務(wù)器不需要存儲用戶Session信息。這顯然增加了系統(tǒng)的可用性和伸縮性,大大減輕了服務(wù)端的壓力??梢钥闯鯦WT更符合設(shè)計RESTful API時的Stateless(無狀態(tài))原則。并且使用JWT認(rèn)證可以有效避免CSRF攻擊,因為JWT一般是存在在localStorage中,使用JWT進(jìn)行身份驗證的過程中是不會涉及到Cookie的。

Part 02

JWT由哪些部分組成?

e8d79734-d300-11ee-a297-92fbcf53809c.png

JWT本質(zhì)上是一組字串,通常是這樣的:xxxxx.yyyyy.zzzzz,通過(.)切分成三個為Base64編碼的部分:

Header:描述JWT的元數(shù)據(jù),定義了生成簽名的算法以及Token的類型。

Payload:用來存放實際需要傳遞的數(shù)據(jù)。

Signature:服務(wù)器通過Payload、Header和一個密鑰(Secret)

使用Header里面指定的簽名算法(默認(rèn)是 HMAC SHA256)生成。

示例:

e8eba49a-d300-11ee-a297-92fbcf53809c.png

可以通過https://jwt.io對上述JWT進(jìn)行解碼,解碼之后便可得到Header、Payload、Signature這三部分。Header和Payload都是JSON格式的數(shù)據(jù),Signature由Payload、Header和Secret(密鑰)通過特定的計算公式和加密算法得到。

e8ff6f7a-d300-11ee-a297-92fbcf53809c.png

Header

通常由兩部分組成。

typ(Type):令牌類型,也就是JWT

alg(Algorithm):簽名算法,比如HS256

示例:

e93eb630-d300-11ee-a297-92fbcf53809c.png

JSON形式的Header被轉(zhuǎn)換成Base64編碼,成為JWT的第一部。

Payload

包含了三種類型的聲明。

Registered Claims(注冊聲明):預(yù)定義的一些聲明,建議使用,但不強(qiáng)制。

Public Claims(公有聲明):JWT簽發(fā)方可以自定義的聲明。

Private Claims(私有聲明):JWT簽發(fā)方因為項目需要而自定義的聲明。

下面是一些常見的注冊聲明:

iss(issuer):JWT 簽發(fā)方。

iat(issued at time):JWT簽發(fā)時間。

sub(subject):JWT主題。

aud(audience):JWT接收方。

exp(expiration time):JWT的過期時間。

nbf(not before time):JWT生效時間,早于該定義的時間的JWT不能被接受處理。

jti(JWT ID):JWT唯一標(biāo)識。

示例:

e955c4ce-d300-11ee-a297-92fbcf53809c.png

Payload部分默認(rèn)是不加密的,一定不要將隱私信息存放在 Payload 當(dāng)中?。?!

JSON 形式的Payload被轉(zhuǎn)換成Base64編碼,成為JWT的第二部分。

Signature

對前兩部分的簽名,作用是防止JWT(主要是payload)被篡改。簽名的生成需要用到:Header+Payload、存放在服務(wù)端的密鑰(一定不要泄露出去)、簽名算法。簽名的計算公式如下:

e966ddae-d300-11ee-a297-92fbcf53809c.png

算出簽名以后,把 Header、Payload、Signature三個部分拼成一個字符串,每個部分之間用"點"(.)分隔,這個字符串就是JWT。

Part 03

JWT如何進(jìn)行用戶認(rèn)證?

在基于JWT進(jìn)行身份驗證的的應(yīng)用程序中,服務(wù)器通過 Payload、Header和Secret(密鑰)創(chuàng)建JWT并將JWT發(fā)送給客戶端??蛻舳私邮盏絁WT之后,會將其保存在Cookie或者localStorage里面,以后客戶端發(fā)出的所有請求都會攜帶這個令牌。

e995c51a-d300-11ee-a297-92fbcf53809c.png

簡化后的步驟如下:

1.用戶向服務(wù)器發(fā)送用戶名、密碼以及驗證碼用于登陸系統(tǒng)。

2.如果用戶用戶名、密碼以及驗證碼校驗正確的話,服務(wù)端會返回已簽名的Token,也就是JWT。

3.用戶以后每次向后端發(fā)請求都在Header中帶上這個JWT。

4.服務(wù)端檢查JWT并從中獲取用戶相關(guān)信息。

兩點建議:

1.建議將JWT存放在localStorage中,放在Cookie中會有CSRF風(fēng)險。

2.請求服務(wù)端并攜帶JWT的常見做法是將其放在HTTP Header的Authorization字段中(Authorization:Bearer Token)

Part 04

JWT如何防止被篡改?

服務(wù)器返回簽名之后,即使JWT被泄露或者截獲,黑客也沒辦法同時篡改Signature、Header、Payload。

這是為什么呢?因為服務(wù)端拿到JWT之后,會解析出其中包含的Header、Payload 以及Signature。服務(wù)端會根據(jù)Header、Payload、密鑰再次生成一個Signature。拿新生成的Signature和JWT中的Signature作對比,如果一樣就說明Header和Payload沒有被修改。

不過,如果服務(wù)端的秘鑰也被泄露的話,黑客就可以同時篡改Signature、Header、Payload了。黑客直接修改了Header和Payload之后,再重新生成一個Signature就可以了。

?注意:密鑰一定保管好,一定不要泄露出去。JWT安全的核心在于簽名,簽名安全的核心在密鑰。

Part 05

JWT如何加強(qiáng)安全性?

1.使用安全系數(shù)高的加密算法。

2.使用成熟的開源庫,沒必要造輪子。

3.JWT存放在localStorage中而不是Cookie中,避免CSRF風(fēng)險。

4.一定不要將隱私信息存放在Payload當(dāng)中。

5.密鑰一定保管好,一定不要泄露出去。JWT安全的核心在于簽名,簽名安全的核心在密鑰。

6.Payload要加入exp(JWT的過期時間),永久有效的JWT不合理。并且JWT的過期時間不易過長。

Part 06

JWT有哪些優(yōu)缺點?

- 優(yōu)點

1.無狀態(tài):自身攜帶用戶信息,不需要在服務(wù)器上保存session信息。

2.可有效避免CSRF攻擊:CSRF攻擊需要依賴Cookie,然而JWT選擇存放在localStorage中,因此非法鏈接無法獲取JWT。

- 缺點

1.不可控:就比如說,我們想要在JWT有效期內(nèi)廢棄一個JWT或者更改它的權(quán)限的話,并不會立即生效,通常需要等到有效期過后才可以。再比如說,當(dāng)用戶Logout的話,JWT也還有效。

Part 07

JWT使用總結(jié)

在“約定優(yōu)于配置,配置優(yōu)于編碼”的開發(fā)理念下,通過Apollo配置中心,程序員不需要每次更改線上配置都要重新發(fā)布服務(wù),成功實現(xiàn)了將配置與編碼解耦,為線上服務(wù)變更配置提供了解決方案。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    31227
  • 密鑰
    +關(guān)注

    關(guān)注

    1

    文章

    138

    瀏覽量

    19758
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    117

    瀏覽量

    6965

原文標(biāo)題:技術(shù) | 什么是JWT?一文讀懂

文章出處:【微信號:5G通信,微信公眾號:5G通信】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    jw和e^jwt的一些理解

    轉(zhuǎn)昨晚看到《電磁場與電磁波》時變電磁場一章,書中又一次出現(xiàn)了jw和e^jwt,之前一直無法理解諸如為什么電感的阻抗可以表示成jwL之類的問題,jw是從哪里推導(dǎo)出來的呢?為什么可以直接與L相乘呢?
    發(fā)表于 05-23 07:39

    開發(fā)人員和嵌入式系統(tǒng)設(shè)計人員如何使用JWT關(guān)閉物聯(lián)網(wǎng)設(shè)備的安全漏洞?

    本文將介紹物聯(lián)網(wǎng)設(shè)備安全威脅,并介紹目前用于應(yīng)對該威脅的設(shè)備。它將確定安全漏洞以及開發(fā)人員和嵌入式系統(tǒng)設(shè)計人員如何使用JWT關(guān)閉它們。
    發(fā)表于 06-16 06:17

    SpringBoot 學(xué)習(xí)筆記

    SpringBoot 學(xué)習(xí)筆記 【整合JWT】添加依賴創(chuàng)建工具類登錄獲取jwt使用jwtDemo源碼參考資料添加依賴pom.xml...com.auth0java-jwt3.12.0
    發(fā)表于 07-01 07:27

    CT107開發(fā)板是哪些部分組成的?

    CT107開發(fā)板是哪些部分組成的?74HC138和74HC573是如何使用的?DS1302和DS18B20是如何進(jìn)行接線的?
    發(fā)表于 07-26 07:43

    Json Web Token是什么?有哪些應(yīng)用呢

    和payload編碼和拼接后經(jīng)過加密算法加密,加密時還要一個密碼,這個密碼保存在服務(wù)器端。大致示意圖如下:Header:head部分組成,一個是token類型,一個是使用的算法,如下類型為jwt
    發(fā)表于 10-18 14:34

    JWT-II智能測量系統(tǒng)使用說明書

    JWT-II智能測量系統(tǒng)使用說明書
    發(fā)表于 07-31 17:07 ?3次下載

    如何才能保證JWT安全

    jwt是什么? JWTs是JSON對象的編碼表示。JSON對象零或多個名稱/值對組成,其中名稱為字符串,值為任意JSON值。JWT有助于在clear(例如在URL中)發(fā)送這樣的信息,
    的頭像 發(fā)表于 09-29 15:09 ?3317次閱讀

    MicroProfile JWT Auth MicroProfile的JWT RBAC規(guī)范

    microprofile-jwt-auth.zip
    發(fā)表于 05-07 10:04 ?0次下載
    MicroProfile <b class='flag-5'>JWT</b> Auth MicroProfile的<b class='flag-5'>JWT</b> RBAC規(guī)范

    jwt-auth基于ThinkPHP的jwt框架

    ./oschina_soft/gitee-jwt-auth.zip
    發(fā)表于 06-30 09:10 ?1次下載
    <b class='flag-5'>jwt</b>-auth基于ThinkPHP的<b class='flag-5'>jwt</b>框架

    為何JWT不適合存儲Session

    很多人錯誤地嘗試比較 Cookies 和 JWT。這種對比毫無意義,就像對比內(nèi)存和硬盤一樣。Cookies 是一種存儲機(jī)制,然而 JWT Tokens 是被加密并簽名后的令牌。
    的頭像 發(fā)表于 11-28 10:23 ?601次閱讀

    JJWT是什么?如何保證 JWT 安全

    JJWT是一個提供端到端的JWT創(chuàng)建和驗證的Java庫。永遠(yuǎn)免費和開源(Apache License,版本2.0),JJWT很容易使用和理解。它被設(shè)計成一個以建筑為中心的流暢界面,隱藏了它的大部分復(fù)雜性。
    發(fā)表于 03-03 15:12 ?1060次閱讀

    jwt冒泡排序的原理

    jwt簡介 冒泡排序: (Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當(dāng)成一個小氣泡,根據(jù)氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。 冒泡
    的頭像 發(fā)表于 09-25 16:33 ?545次閱讀
    <b class='flag-5'>jwt</b>冒泡排序的原理

    JWT認(rèn)證流程

    間傳遞被認(rèn)證用戶身份信息,以便于從資源服務(wù)器獲取資源。 基于token的鑒權(quán)機(jī)制 基于token的鑒權(quán)機(jī)制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶認(rèn)證信息或者會話
    的頭像 發(fā)表于 10-08 15:01 ?1269次閱讀
    <b class='flag-5'>JWT</b>的<b class='flag-5'>認(rèn)證</b>流程

    后端JWT接口認(rèn)證的操作流程

    流程 2. JWT 介紹 JWT 全稱為 JSON Web Token,是目前主流的跨域認(rèn)證解決方案 數(shù)據(jù)結(jié)構(gòu) 3 部分組成,中間
    的頭像 發(fā)表于 10-31 11:20 ?725次閱讀

    JWT滲透姿勢一篇通

    Signature是使用指定算法對Header和Payload進(jìn)行簽名生成的,用于驗證JWT的完整性和真實性,Signature的生成方式通常是將Header和Payload連接起來然后使用指定算法對其進(jìn)行簽名
    的頭像 發(fā)表于 11-13 16:04 ?1053次閱讀
    <b class='flag-5'>JWT</b>滲透姿勢一篇通