token session cookie的個人理解

2022-09-24 01:45:09 字數 2315 閱讀 5550

token 可以理解為就是乙個令牌,原理:

客戶端使用使用者名稱和密碼請求登入。服務端收到請求,驗證使用者名稱和密碼。驗證成功後,服務端會生成乙個token,然後把這個token傳送給客戶端。客戶端收到token後把它儲存起來,可以放在cookie或者local storage(本地儲存)裡。客戶端每次向服務端傳送請求的時候都需要帶上服務端發給的token。服務端收到請求,然後去驗證客戶端請求裡面帶著token,如果驗證成功,就向客戶端返回請求的資料。

簡單token的組成;uid(使用者唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token的前幾位以雜湊演算法壓縮成的一定長度的十六進製制字串。為防止token洩露。

生成方式: mac位址(手機本身的位址),第二就是服務端根據使用者的pin和密碼,本地生成乙個乙個sessionid,作為token(存在sessoin裡面),

存活時間:token本身服務端設定了生存時間,一旦超過使用者需要重新登入,

token的檢索時間,是在服務端資料庫裡面儲存,當然也可以在記憶體中存放,用於提公升檢索速度。

加密不能用明文方式進行儲存,要用https 或者特定加密演算法。(將請求url、時間戳、token三者合併)

在**中,http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會自動的把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前使用者是哪個了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4kb。因此使用cookie只能儲存一些小量的資料。

session和cookie的作用有點類似,都是為了儲存使用者相關的資訊。不同的是,cookie是儲存在本地瀏覽器,而session儲存在伺服器。儲存在伺服器的資料會更加的安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會占用伺服器的資源

1、儲存在服務端:通過cookie儲存乙個session_id,然後具體的資料則是儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存乙個session_id,下次再次請求的時候,會把該session_id攜帶上來,伺服器根據session_id在session庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做server side session。

2、將session資料加密,然後儲存在cookie中。這種專業術語叫做client side session。flask採用的就是這種方式,但是也可以替換成其他形式。

3. 為什麼會有token的出現?

答:首先,session的儲存是需要空間的,其次,session的傳遞一般都是通過cookie來傳遞的,或者url重寫的方式;而token在伺服器是可以不需要儲存使用者的資訊的,而token的傳遞方式也不限於cookie傳遞,當然,token也是可以儲存起來的;

4. token的生成方式?

答:瀏覽器第一次訪問伺服器,根據傳過來的唯一標識userid,服務端會通過一些演算法,如常用的hmac-sha256演算法,然後加乙個金鑰,生成乙個token,然後通過base64編碼一下之後將這個token傳送給客戶端;客戶端將token儲存起來,下次請求時,帶著token,伺服器收到請求後,然後會用相同的演算法和金鑰去驗證token,如果通過,執行業務操作,不通過,返回不通過資訊;

5. token和session的區別?

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

session伺服器會儲存乙份,可能儲存到快取,檔案,資料庫;同樣,session和token都是有過期時間一說,都需要去管理過期時間;

其實token與session的問題是一種時間與空間的博弈問題,session是空間換時間,而token是時間換空間。兩者的選擇要看具體情況而定。

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

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

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

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

參考文章:

token和 session的分別

關於Java nofity wait的個人理解

首先notify,wait的經典場景是生產者,消費者模型 importorg.slf4j.logger created by wcl on 17 9 17.public classconsumerimplementsrunnable public voidrun 消費 1,當前數量 name,con...

cookie和session的個人簡單理解

瀏覽器 客戶端發起請求 伺服器響應 setcookie要求瀏覽器 客戶端生成乙個cookie 瀏覽器 客戶端儲存cookie,並在下次請求中在請求頭中傳送這個cookie 伺服器識別這個瀏覽器發來的cookie,證明是同一使用者 這個使用者請求相同的伺服器都會傳送這一cookie重複3 5步,伺服器...

Vue的slot scope的場景的個人理解

vue的插槽slot,分為3種 前兩種很好理解,無論就是子元件裡定義乙個slot佔位符,父元件呼叫時,在slot對應的位置填充模板就好了。作用域插槽的慨念,文件卻只有一句簡單的描述 有的時候你希望提供的元件帶有乙個可從子元件獲取資料的可復用的插槽。網路上大多數文章,也是千篇一律的翻譯這句話,可是僅憑...