國家攝影網站百度發(fā)布信息怎么弄
手打不易,如果轉摘,請注明出處!
注明原文:https://zhangxiaofan.blog.csdn.net/article/details/133498756
文章目錄
- 簡析Cookie、Session、Token
- 什么是 Cookie ?
- 什么是 Session ?
- Cookie 和 Session 到底是什么關系?
- 什么是 Token ?
- Session VS Token ?
- 總結
簡析Cookie、Session、Token
什么是 Cookie ?
- cookie 存儲在前端
例如第一次請求后端,會創(chuàng)建一個 sessionId 返回給前端,那么前端就會把 sessionId:xxxx 保存到 cookie 中, 下次請求的時候,前端會攜帶這個數據發(fā)送到后端。 - cookie 無法跨域
- cookie 只支持存儲字符串數據, 大部分瀏覽器都不能超過 4KB
例如某次訪問CSDN中的cookie
{Cookie: JSESSIONID=5124fa26-9334-4c7d-9123-6141b14b9c92;uuid_tt_dd=10_20850520640-1656988062941-486962;UserName=qXXXX4;UserInfo=8d100c5XXX4dd7a3fbc5e97;UserToken=8d100c5XXX0f4dd7a3fbc5e97;UserNick=Mr.XXX.;...
}
什么是 Session ?
- session 存儲在后端
session 用于記錄前后端會話信息,本身是基于 cookie 實現(xiàn)的,session 存儲在后端(例如:redis),sessionId 則存儲在前端的 cookie 中。因此 session 相對來說更安全。
簡單的來說:sessionID 是連接 Cookie 和 Session 的一道橋梁;
注意:這并不是說它是唯一的橋梁,我們也可以在 sessionId 拼接在請求 url 的 parameter 中。 - session 能存儲任意Object對象,大小理論上不限制,只要內存夠。
一般session存哪些信息?
例如 org.apache.shiro.session.mgt.SimpleSession
就存儲了以下信息:
private transient Serializable id;
private transient Date startTimestamp;
private transient Date stopTimestamp;
private transient Date lastAccessTime;
private transient long timeout;
private transient boolean expired;
private transient String host;
private transient Map<Object, Object> attributes;
包括:id、時間戳、過期時間、host、各種屬性 attributes Map等等。
Cookie 和 Session 到底是什么關系?
網上一大把的文章都在對比 cookie 和 session。
嚴格來說, cookie 是一種存儲方式, session 是會話記錄。它們不應該看成一個維度的概念。
相同點就是它們都可以用來存儲用戶信息。
cookie 安全性、存儲量有一定限制,但不會占用服務端資源。
session 安全性高、存儲信息大,認證會話信息一般都存放在 session。
cookies 只是一種可以用來實現(xiàn) session 的方式,但并不是唯一,理論上只要 sessionId 可以通過其他安全方式傳輸到服務端就行。
我也是比較 反對直接拿 cookie 和 session 做對比的 。
因此筆者認為,如果非要加一層關系,那么可以看成 協(xié)作互補。
什么是 Token ?
說到 token ,這里必須說一下 token 可以簡單看成 2 大類型:
一種是本身不攜帶信息的token(傳統(tǒng)token);
一種是本身就攜帶用戶或認證信息的 token(例如JWT);
sessionId 就可以看成一個傳統(tǒng)的 token。
token 就是一個令牌,前端請求發(fā)送到服務端,驗證成功后,后端會生成一個 token 給前端,前端下次請求(有效期內)只需要帶著這個 token 就可以訪問后端API。
對于傳統(tǒng)的 Token 來講,服務端拿到 token 后需要去查數據庫(Mysql、Redis等)校驗是否過期或者是否有效
對于JWT這種類型的 Token 來講,服務端本身是不存儲信息的,直接通過解密和驗證JWT即可。
Session VS Token ?
很多人直接把這兩者進行比較,這樣容易受誤導。因為 Token 是有不同的實現(xiàn)方式,有的攜帶認證信息,有的不攜帶認證信息,那么在比較的時候,就要區(qū)分開來。
- session 是把會話信息到了服務端, 讓本身無狀態(tài)的 HTTP 變得
有狀態(tài)
, 而 Token 是為了讓服務端無狀態(tài)
. - session 存儲用戶信息到服務端后,返回 sessionId 給前端,用于 sessionId 的隨機性,所以可以看成 session 存儲是安全的。 傳統(tǒng)的 token 也需要存儲信息到服務端,sessionId 就可以看成一個傳統(tǒng)的 token。而 JWT這類Token 是本身攜帶信息的 token,無需存儲到后端服務器。
- session 可以看成
空間換時間
, JWT這類Token 可以看成時間換空間
,傳統(tǒng)的 token 實際上也占用了空間。 - token 實現(xiàn)跨域更方便,因為本身就是讓服務端
無狀態(tài)
。
總結
- Cookie 和 Session 不要直接拿來對比, Cookie 是一種前端存儲方式,Session 是存在服務端的會話記錄。詳情看:Cookie 和 Session 到底是什么關系?
- Session 與 Token 做比較的時候,也要區(qū)分是 傳統(tǒng)Token 還是 JWT之類的token