[編程]-web認證
時間:2023-08-31 21:24:01 | 來源:網(wǎng)站運營
時間:2023-08-31 21:24:01 來源:網(wǎng)站運營
[編程]-web認證:cookie在客戶端
cookie 是不可跨域的: 每個 cookie 都會綁定單一的域名,無法在別的域名下獲取使用,一級域名和二級域名之間是允許共享使用的(靠的是 domain)
session 是基于 cookie 實現(xiàn)的,session 存儲在服務(wù)器端,sessionId 會被存儲到客戶端的cookie 中
單個 Cookie 保存的數(shù)據(jù)不能超過 4K
每次請求都要帶token,token在header
token是簽名后的憑證
token不存儲在服務(wù)器端
token是無狀態(tài)的設(shè)計
(ssession使得服務(wù)器有狀態(tài)化)
jwt支持跨域認證
jwt自包含了一些會話信息,所以對數(shù)據(jù)庫的查詢操作較少(jwt會查詢數(shù)據(jù)庫嗎? 如果把解密jwt的密鑰存數(shù)據(jù)庫的話就需要查詢)
jwt的token可以保存在localstorage,也可以使用cookie?
jwt不使用cookie,所以不用擔心跨域(和上一條沖突? 放cookie里發(fā)送不能跨域。但是放header里是可以跨域的)
無狀態(tài): 狀態(tài)不存在服務(wù)器端
*** jwt的使用- 方式1
header里:
Authorization: Bearer <token>
- 方式2
跨域時,可以將jwt放post請求的body里
- 方式3
url傳送:
http://www.example.com/user?token=xxx可以減少查詢數(shù)據(jù)庫次數(shù)
服務(wù)器不存儲jwt,故不涉及session那樣在集群下需要共享的問題。
但是這也導(dǎo)致jwt一旦下發(fā)token后就無法廢棄該token或更改其權(quán)限(即無法隨時踢客戶端下線)。
故jwt的有效期盡量要設(shè)短。
適合一次性的命令認證。
為了避免盜用,應(yīng)該使用https。
*** cookie的使用不要存敏感信息
因和域名綁定,無法跨域
移動端對cookie支持不是很好,session要基于cookie(存sessionId)實現(xiàn),所以移動端常用的是token。
*** session的使用用戶在線量多時, 需要及時清內(nèi)存
集群部署的問題: 產(chǎn)生session的是某個服務(wù)器,如果后來處理請求的服務(wù)器不是產(chǎn)生session的服務(wù)器,就涉及session共享的問題。
cookie涉及跨域,所以為了避免這個問題,也有做法是把sessionId放在url里
*** token的使用一般用內(nèi)存如redis來提高查詢效率
token 可以避免 CSRF 攻擊(因為不需要 cookie 了)
**** 和jwt的區(qū)別單純的token需要存服務(wù)器比如redis里,jwt不用(因?qū)oken和payload加密后存客戶端了)
要做隨時踢下線這種強管理的功能,就需要用token-session這種有狀態(tài)的模型,比如用sa-token框架(這里的意思應(yīng)該是指這個框架,可以有token方式,也可以有session方式)。
token如何和session結(jié)合?
//一般沒有這種做法。如果token作為session的id,那其實還是session的方式。
摘要自:
還分不清 Cookie、Session、Token、JWT? - 老劉的文章 - 本站