成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用 30s 給面試官講清楚什么是 Token

開發(fā) 架構
驗證用戶名密碼等,驗證成功后生成 Access Token 和 Refresh Token 并返回給前端,服務端需要將這兩個 token 及其對應的用戶信息存儲在數據庫或者緩存中

?引言

前文介紹了 Session-Cookie 的認證過程,簡單回顧下基本步驟:

  • 客戶端(瀏覽器)向服務器發(fā)送用戶名和密碼
  • 服務器驗證通過后,創(chuàng)建 Session 對象,在 Session 中保存該用戶相關的數據,比如用戶角色、登錄時間等等
  • 服務器向用戶返回這個 Session 對象的唯一標識 SessionId,并寫入客戶端的 Cookie
  • 客戶端隨后的每一次請求,都會通過 Cookie,將 SessionId 傳回服務器
  • 服務器收到 SessionId,并據此找到 Session 對象,由此獲取到用戶信息

這種方法的缺點就是分布式集群情況下無法保證每臺服務器都擁有相同的 Session,上篇文章也簡單介紹了幾種 Session 如何在多個服務器之間共享的方法。

顯然,Session 的維護給服務端造成了很大的困擾,有沒有更好的方案,能不能直接不用 Session?

為此,Token 應運而生。

30s 圖解 Token 認證

首先,什么是 Token?

簡單來說,Token 其實就是一串字符串,一個令牌,客戶端訪問服務器時,驗證通過后服務端會為其簽發(fā)一張令牌,之后,客戶端就可以攜帶這個令牌訪問服務器,服務端只需要驗證令牌的有效性即可。

一般來說,Token 的組成是這樣的:

uid? (用戶唯一的身份標識) + time? (當前時間的時間戳) + sign (簽名,Token 的前幾位以哈希算法壓縮成的一定長度的十六進制字符串)

基于 token 的認證步驟如下圖,配合文字食用:

圖片

1)客戶端(瀏覽器):用戶向服務器發(fā)送登錄信息(用戶名和密碼)來請求登錄校驗;

2)服務端:驗證用戶名密碼等,驗證成功后生成 token 并返回給前端,這個 token 就是之后鑒權的唯一憑證。服務端需要將這個 token 及其對應的用戶信息存儲在數據庫或者緩存中;

3)客戶端:將服務端返回的 token 存在 cookie 或者 localStorge 中,之后的每次請求之前,從 cookie 或者 localStorge 取出 token 將其設置進 HTTP Header 中(可以通過 HTTP 請求攔截器實現);

4)服務端:服務端接收到來自客戶端的請求,從 HTTP Header 中取出 token,去緩存或者數據庫中進行驗證(該 token 是否存在 / 根據該 token 能否找到對應的用戶),如果驗證通過則執(zhí)行進一步的業(yè)務操作,如果不通過則拒絕執(zhí)行。

附加閱讀

Token 認證服務端代碼

先來看登錄,就是先判斷用戶名密碼是否正確,如果正確,那么會生成并返回一個字符串做為 token(這里偷個懶就直接用 UUID 來生成了),并將其和用戶信息(這里就簡單的存了 username)一并存入到數據庫 or 緩存中(這里采用 Redis,過期時間可自行配置)。

退出登錄實質就是刪除 Redis 中存儲的 token,完整內容如下:

圖片

再來個攔截器,前端拿到后端返回的 token 后每次請求前都會在 HTTP header 中帶上這個 token,服務端設置個攔截器取出 Header 中的token,然后去 Redis 中進行判斷這個 token 是否存在,若存在則允許進行下一步操作,:

圖片

Refresh Token

一般來說,為了安全起見,防止 token 被攻擊者盜用,token 的有效期不會設置的太長,這樣就會由于 token 過期導致用戶需要重新登錄從而生成新的 token。

如何才能做到不需要用戶去頻繁的登錄呢,Refresh Token 機制出現了。

我們把之前的那個 Token 稱之為 Access Token,業(yè)務接口用這個 Access Token 進行認證鑒權

而 Refresh Token 呢,就是一個專門用來在 Access Token 過期后重新獲取新的 Access Token 的 Token

Refresh Token 的過期時間設置的長一點比如一兩個月,Access Token 的過期時間設置短一點比如一周,這樣可以縮短 Access Token 的過期時間保證安全,同時又不會因為頻繁過期重新要求用戶登錄

具體認證步驟如下圖,配合文字食用:

圖片

1)客戶端(瀏覽器):用戶向服務器發(fā)送登錄信息(用戶名和密碼)來請求登錄校驗;

2)服務端:驗證用戶名密碼等,驗證成功后生成 Access Token 和 Refresh Token 并返回給前端,服務端需要將這兩個 token 及其對應的用戶信息存儲在數據庫或者緩存中;

3)客戶端:將服務端返回的 Access Token 和 Refresh Token 存在 cookie 或者 localStorge 中,之后的每次請求之前,從 cookie 或者 localStorge 取出 Access Token 將其設置進 HTTP Header 中(可以通過 HTTP 請求攔截器實現);

4)服務端:

  • 驗證 Access Token 有效:正常返回數據
  • 驗證 Access Token 過期:拒絕請求

客戶端:重新發(fā)起請求,在 HTTP Header 中攜帶 Refresh Token 發(fā)送給服務端

服務端:驗證客戶端傳來的 Refresh Token ,驗證成功后生成新的 Access Token 并返回給客戶端

客戶端:獲得服務端返回的新的 Access Token,重新發(fā)起請求并攜帶新的 Access Token

如何理解 Refresh Token 的必要性,或者說為什么使用 Refresh Token 能夠更安全?

Access Token 每次訪問都要帶著,因此更容易被盜取

而 Refresh Token 客戶端獲取到之后就保存起來,Access Token 失效之后,才會用到 Refresh Token,所以粗略來說 Refresh Token 只會在網絡上傳輸兩次,一次是你獲取的時候,一次是你使用的時候(從上圖可以看出來),因此 Refresh Token 被盜的風險遠遠小于 Access Token


責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2021-08-04 20:36:12

MySQL結構體系

2018-05-21 07:08:18

行為驅動開發(fā)BDD編碼

2020-07-29 09:21:34

Docker集群部署隔離環(huán)境

2021-07-05 22:22:24

協議MQTT

2021-09-07 10:44:33

Java 注解開發(fā)

2019-07-07 08:18:10

MySQL索引數據庫

2022-01-05 09:27:24

讀擴散寫擴散feed

2021-10-29 11:30:31

補碼二進制反碼

2025-04-29 05:00:00

2025-03-27 03:55:00

2024-02-22 15:36:23

Java內存模型線程

2021-12-08 06:53:29

面試動態(tài)代理

2022-09-29 07:30:57

數據庫索引字段

2024-04-01 10:09:23

AutowiredSpring容器

2019-06-20 17:49:51

RPCHTTP協議

2017-12-17 20:17:23

NoSQLSQL數據

2018-08-13 09:20:21

NoSQLSQL數據

2024-01-05 07:55:39

Linux虛擬內存

2021-07-07 10:28:09

分布式架構系統(tǒng)

2023-12-06 09:10:28

JWT微服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成年女人免费v片 | 97精品视频在线 | 欧美a区| 无码日韩精品一区二区免费 | 久久久久国产精品午夜一区 | 欧美激情一区二区 | 国产91av视频在线观看 | 久久精品欧美一区二区三区麻豆 | 亚洲天天| 综合久久一区 | 国产aaaaav久久久一区二区 | 久久亚洲一区 | 中文字幕一区二区三区四区 | 午夜影院在线免费观看视频 | 亚洲国产高清高潮精品美女 | 欧美日韩亚洲系列 | 国产精品视频在线观看 | 午夜国产一级 | 91精品一区二区三区久久久久 | 中文字幕成人av | 中文字幕av第一页 | 日韩欧美在| 四虎永久 | 免费观看av网站 | 亚洲欧美精品国产一级在线 | 国产视频在线观看一区二区三区 | 国产成都精品91一区二区三 | 亚洲情综合五月天 | 亚洲精品久久久一区二区三区 | 欧美精品一区免费 | 欧美日韩一区在线观看 | 欧美久久久久久久 | 欧美一区二区三区在线播放 | 日韩综合在线 | 久久久久九九九女人毛片 | 三级成人在线观看 | 亚洲综合色站 | 国产精品视频一区二区三区不卡 | 国产精品久久国产精品久久 | 黄色一级大片在线观看 | 欧美区在线观看 |