日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jwt如何防止token被窃取_JWT令牌

發(fā)布時間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jwt如何防止token被窃取_JWT令牌 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

6.3.1 JWT介紹

通過上邊的測試我們發(fā)現(xiàn),當(dāng)資源服務(wù)和授權(quán)服務(wù)不在一起時資源服務(wù)使用RemoteTokenServices 遠(yuǎn)程請求授權(quán)服務(wù)驗證token,如果訪問量較大將會影響系統(tǒng)的性能 。

解決上邊問題:

令牌采用JWT格式即可解決上邊的問題,用戶認(rèn)證通過會得到一個JWT令牌,JWT令牌中已經(jīng)包括了用戶相關(guān)的信息,客戶端只需要攜帶JWT訪問資源服務(wù),資源服務(wù)根據(jù)事先約定的算法自行完成令牌校驗,無需每次都請求認(rèn)證服務(wù)完成授權(quán)。

1、什么是JWT?

JSON Web Token(JWT)是一個開放的行業(yè)標(biāo)準(zhǔn)(RFC 7519),它定義了一種簡介的、自包含的協(xié)議格式,用于在通信雙方傳遞json對象,傳遞的信息經(jīng)過數(shù)字簽名可以被驗證和信任。JWT可以使用HMAC算法或使用RSA的公鑰/私鑰對來簽名,防止被篡改。

官網(wǎng):JWT.IO

標(biāo)準(zhǔn): JSON Web Token (JWT)

JWT令牌的優(yōu)點(diǎn):

1)jwt基于json,非常方便解析。

2)可以在令牌中自定義豐富的內(nèi)容,易擴(kuò)展。

3)通過非對稱加密算法及數(shù)字簽名技術(shù),JWT防止篡改,安全性高。

4)資源服務(wù)使用JWT可不依賴認(rèn)證服務(wù)即可完成授權(quán)。

缺點(diǎn):

1)JWT令牌較長,占存儲空間比較大。

2、JWT令牌結(jié)構(gòu)

通過學(xué)習(xí)JWT令牌結(jié)構(gòu)為自定義jwt令牌打好基礎(chǔ)。

JWT令牌由三部分組成,每部分中間使用點(diǎn)(.)分隔,比如:xxxxx.yyyyy.zzzzz

  • Header

頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)

一個例子如下:

下邊是Header部分的內(nèi)容

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

將上邊的內(nèi)容使用Base64Url編碼,得到一個字符串就是JWT令牌的第一部分。

  • Payload

第二部分是負(fù)載,內(nèi)容也是一個json對象,它是存放有效信息的地方,它可以存放jwt提供的現(xiàn)成字段,比如:iss(簽發(fā)者),exp(過期時間戳), sub(面向的用戶)等,也可自定義字段。

此部分不建議存放敏感信息,因為此部分可以解碼還原原始內(nèi)容。

最后將第二部分負(fù)載使用Base64Url編碼,得到一個字符串就是JWT令牌的第二部分。

一個例子:

{ "sub": "1234567890","name": "456","admin": true }
  • Signature

第三部分是簽名,此部分用于防止jwt內(nèi)容被篡改。

這個部分使用base64url將前兩部分進(jìn)行編碼,編碼后使用點(diǎn)(.)連接組成字符串,最后使用header中聲明簽名算法進(jìn)行簽名。

一個例子:

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

base64UrlEncode(header):jwt令牌的第一部分。

base64UrlEncode(payload):jwt令牌的第二部分。

secret:簽名所使用的密鑰。

6.3.2 配置JWT令牌服務(wù)

在uaa中配置jwt令牌服務(wù),即可實(shí)現(xiàn)生成jwt格式的令牌。

1、TokenConfig

@Configuration

2、定義JWT令牌服務(wù)

@Autowired

6.3.3 生成jwt令牌

6.3.4 校驗jwt令牌

資源服務(wù)需要和授權(quán)服務(wù)擁有一致的簽字、令牌服務(wù)等:

1、將授權(quán)服務(wù)中的TokenConfig類拷貝到資源 服務(wù)中

2、屏蔽資源 服務(wù)原來的令牌服務(wù)類

@Configuration

3、測試

1)申請jwt令牌

2)使用令牌請求資源

小技巧:

令牌申請成功可以使用/uaa/oauth/check_token校驗令牌的有效性,并查詢令牌的內(nèi)容,例子如下:

6.4 完善環(huán)境配置

截止目前客戶端信息和授權(quán)碼仍然存儲在內(nèi)存中,生產(chǎn)環(huán)境中通過會存儲在數(shù)據(jù)庫中,下邊完善環(huán)境的配置:

6.4.1 創(chuàng)建表

在user_db中創(chuàng)建如下表:

DROP TABLE IF EXISTS `oauth_client_details`; CREATE TABLE `oauth_client_details` (`client_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客戶端標(biāo) 識',`resource_ids` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接入資源列表',`client_secret` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客戶端秘鑰',`scope` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authorized_grant_types` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`web_server_redirect_uri` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authorities` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`access_token_validity` int(11) NULL DEFAULT NULL,`refresh_token_validity` int(11) NULL DEFAULT NULL,`additional_information` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL,`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),`archived` tinyint(4) NULL DEFAULT NULL,`trusted` tinyint(4) NULL DEFAULT NULL,`autoapprove` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`client_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '接入客戶端信息' ROW_FORMAT = Dynamic; INSERT INTO `oauth_client_details` VALUES ('c1', 'res1', '$2a$10$NlBC84MVb7F95EXYTXwLneXgCca6/GipyWR5NHm8K0203bSQMLpvm', 'ROLE_ADMIN,ROLE_USER,ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', NULL, 7200, 259200, NULL, '2019‐09‐09 16:04:28', 0, 0, 'false'); INSERT INTO `oauth_client_details` VALUES ('c2', 'res2', '$2a$10$NlBC84MVb7F95EXYTXwLneXgCca6/GipyWR5NHm8K0203bSQMLpvm', 'ROLE_API', 'client_credentials,password,authorization_code,implicit,refresh_token', 'http://www.baidu.com', NULL, 31536000, 2592000, NULL, '2019‐09‐09 21:48:51', 0, 0, 'false');

oauth_code表,Spring Security OAuth2使用,用來存儲授權(quán)碼:

DROP TABLE IF EXISTS `oauth_code`; CREATE TABLE `oauth_code` (`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`authentication` blob NULL,INDEX `code_index`(`code`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

6.4.2 配置授權(quán)服務(wù)

(1)修改AuthorizationServer:

ClientDetailsService和AuthorizationCodeServices從數(shù)據(jù)庫讀取數(shù)據(jù)。

@Configuration

6.4.3測試

1、測試申請令牌

使用密碼模式申請令牌,客戶端信息需要和數(shù)據(jù)庫中的信息一致。

POST http://localhost:53020/uaa/oauth/token

2、測試授權(quán)碼模式

生成的授權(quán)存儲到數(shù)據(jù)庫中。

http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=http://www.baidu.com

注意scope=?,查看數(shù)據(jù)庫

POST http://localhost:53020/uaa/oauth/token

總結(jié)

以上是生活随笔為你收集整理的jwt如何防止token被窃取_JWT令牌的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。