Session Token身份驗證方法

2021-09-02 17:36:00 字數 1832 閱讀 5797

session:我發給你一張身份證,但只是一張寫著身份證號碼的紙片。你每次來辦事,我去後台查一下你的 id 是不是有效。 

token:我發給你一張加密的身份證,以後你只要出示這張卡片,我就知道你一定是自己人。 

token和session其實都是為了身份驗證,session一般翻譯為會話,而token更多的時候是翻譯為令牌。

session伺服器會儲存乙份,可能儲存到快取,檔案,資料庫。

同樣,session和token都是有過期時間一說,都需要去管理過期時間;其實token與session的問題是一種時間與空間的博弈問題,session是空間換時間,而token是時間換空間。兩者的選擇要看具體情況而定。

雖然確實都是「客戶端記錄,每次訪問攜帶」,但 token 很容易設計為自包含的,也就是說,後端不需要記錄什麼東西,每次乙個無狀態請求,每次解密驗證,每次當場得出合法 /非法的結論。這一切判斷依據,除了固化在 cs 兩端的一些邏輯之外,整個資訊是自包含的。這才是真正的無狀態。 

而 sessionid ,一般都是一段隨機字串,需要到後端去檢索 id 的有效性。萬一伺服器重啟導致記憶體裡的 session 沒了呢?萬一 redis 伺服器掛了呢? 

http 是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再傳送請求時候,還得再驗證一下。

解決的方法就是,當使用者請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的 id 號傳送給客戶端,客戶端收到以後把這個 id 號儲存在 cookie 裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個 cookie ,這樣服務端會驗證乙個這個 cookie 裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。

上面說的就是 session,我們需要在服務端儲存為登入的使用者生成的 session ,這些 session 可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的 session 。

1、使用者向伺服器傳送使用者名稱和密碼。

2、伺服器驗證通過後,在當前對話(session)裡面儲存相關資料,比如使用者角色、登入時間等等。

3、伺服器向使用者返回乙個 session_id,寫入使用者的 cookie。

4、使用者隨後的每一次請求,都會通過 cookie,將 session_id 傳回伺服器。

5、伺服器收到 session_id,找到前期儲存的資料,由此得知使用者的身份。

使用基於 token 的身份驗證方法,在服務端不需要儲存使用者的登入記錄。大概的流程是這樣的:

客戶端使用使用者名稱跟密碼請求登入

服務端收到請求,去驗證使用者名稱與密碼

驗證成功後,服務端會簽發乙個 token,再把這個 token 傳送給客戶端

客戶端收到 token 以後可以把它儲存起來,比如放在 cookie 裡或者 local storage 裡

客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 token

服務端收到請求,然後去驗證客戶端請求裡面帶著的 token,如果驗證成功,就向客戶端返回請求的資料

參考

乾掉狀態:從session到token

json web token 入門教程

基於 token 的身份驗證:json web token(附:node.js 專案)

session 與 token 的區別

Session,Token相關區別

1.為什麼要有session的出現?答 是由於網路中http協議造成的,因為http本身是無狀態協議,這樣,無法確定你的本次請求和上次請求是不是你傳送的。如果要進行類似論壇登陸相關的操作,就實現不了了。2.session生成方式?答 瀏覽器第一次訪問伺服器,伺服器會建立乙個session,然後同時為...

SpringBoot 使用jwt進行身份驗證

這裡只供參考,比較使用jwt方式進行身份驗證感覺不好,最不行的就是不能退出 登陸時設定多長過期時間,只能等這個時間過了以後才算退出,服務端只能驗證請求過來的token是否通過驗證 code created by qhong on 2018 6 7 15 34 標註該註解的,就不需要登入 target...

JSP使用Servlet過濾器進行身份驗證的方法

1 servlet過濾器的作用描述 1 在httpservletrequest到達servlet 之前,攔截客戶的httpservletrequest。根據需要檢查httpservletrequest,也可以修改httpservletrequest頭和資料。2 在httpservletrespons...