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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

6.3.1 JWT介紹

通過上邊的測試我們發現,當資源服務和授權服務不在一起時資源服務使用RemoteTokenServices 遠程請求授權服務驗證token,如果訪問量較大將會影響系統的性能 。

解決上邊問題:

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

1、什么是JWT?

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

官網:JWT.IO

標準: JSON Web Token (JWT)

JWT令牌的優點:

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

2)可以在令牌中自定義豐富的內容,易擴展。

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

4)資源服務使用JWT可不依賴認證服務即可完成授權。

缺點:

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

2、JWT令牌結構

通過學習JWT令牌結構為自定義jwt令牌打好基礎。

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

  • Header

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

一個例子如下:

下邊是Header部分的內容

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

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

  • Payload

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

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

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

一個例子:

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

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

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

一個例子:

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

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

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

secret:簽名所使用的密鑰。

6.3.2 配置JWT令牌服務

在uaa中配置jwt令牌服務,即可實現生成jwt格式的令牌。

1、TokenConfig

@Configuration

2、定義JWT令牌服務

@Autowired

6.3.3 生成jwt令牌

6.3.4 校驗jwt令牌

資源服務需要和授權服務擁有一致的簽字、令牌服務等:

1、將授權服務中的TokenConfig類拷貝到資源 服務中

2、屏蔽資源 服務原來的令牌服務類

@Configuration

3、測試

1)申請jwt令牌

2)使用令牌請求資源

小技巧:

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

6.4 完善環境配置

截止目前客戶端信息和授權碼仍然存儲在內存中,生產環境中通過會存儲在數據庫中,下邊完善環境的配置:

6.4.1 創建表

在user_db中創建如下表:

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 '客戶端標 識',`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使用,用來存儲授權碼:

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 配置授權服務

(1)修改AuthorizationServer:

ClientDetailsService和AuthorizationCodeServices從數據庫讀取數據。

@Configuration

6.4.3測試

1、測試申請令牌

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

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

2、測試授權碼模式

生成的授權存儲到數據庫中。

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

注意scope=?,查看數據庫

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。