什麼是cookie
Cookie 其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie 。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie 一同提交給服務器。服務器檢查該Cookie ,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie 的內容。算法
- Cookie 存儲在客戶端: Cookie 是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。
- Cookie 是不可跨域的: 每一個 Cookie 都會綁定單一的域名,沒法在別的域名下獲取使用,一級域名和二級域名之間是容許共享使用的(靠的是 domain)。
屬性 | 說明 |
---|---|
name=value | 鍵值對,設置 Cookie 的名稱及相對應的值,都必須是字符串類型 - 若是值爲 Unicode 字符,須要爲字符編碼。 - 若是值爲二進制數據,則須要使用 BASE64 編碼。 |
domain | 指定 cookie 所屬域名,默認是當前域名 |
path | 指定 cookie 在哪一個路徑(路由)下生效,默認是 '/'。 若是設置爲 /abc ,則只有 /abc 下的路由能夠訪問到該 cookie,如:/abc/read 。 |
maxAge | cookie 失效的時間,單位秒。若是爲整數,則該 cookie 在 maxAge 秒後失效。若是爲負數,該 cookie 爲臨時 cookie ,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該 cookie 。若是爲 0,表示刪除該 cookie 。默認爲 -1。 - 比 expires 好用。 |
expires | 過時時間,在設置的某個時間點後該 cookie 就會失效。 通常瀏覽器的 cookie 都是默認儲存的,當關閉瀏覽器結束這個會話的時候,這個 cookie 也就會被刪除 |
secure | 該 cookie 是否僅被使用安全協議傳輸。安全協議有 HTTPS,SSL等,在網絡上傳輸數據以前先將數據加密。默認爲false。 當 secure 值爲 true 時,cookie 在 HTTP 中是無效,在 HTTPS 中才有效。 |
httpOnly | 若是給某個 cookie 設置了 httpOnly 屬性,則沒法經過 JS 腳本 讀取到該 cookie 的信息,但仍是能經過 Application 中手動修改 cookie,因此只是在必定程度上能夠防止 XSS 攻擊,不是絕對的安全 |
什麼是session
- session 是另外一種記錄服務器和客戶端會話狀態的機制
- session 是基於 cookie 實現的,session 存儲在服務器端,sessionId 會被存儲到客戶端的cookie 中
session 認證流程:數據庫
- 用戶認證成功後,在服務端生成用戶相關的數據保存在session(當前會話)中
- 發給客戶端的session_id存放到cookie中,這樣用戶客戶端請求時帶上session_id就能夠驗證服務器端是否存在session數據,
- 以此完成用戶的合法校驗,當用戶退出系統或session過時銷燬時,客戶端的session_id也就無效了。
Cookie 和 Session 的區別
- 安全性: session 比 Cookie 安全,session是存儲在服務器端的,Cookie 是存儲在客戶端的。
- 共同點:cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式
- 有效期不一樣: Cookie 可設置爲長時間保持,好比咱們常常使用的默認登陸功能,Session 通常失效時間較短,客戶端關閉(默認狀況下)或者 Session 超時都會失效。
- 存儲大小不一樣: cookie數據保存在客戶端,保存數據不安全且存儲數據量有限;
- session數據保存在服務器端,保存數據安全且存儲數據量大,session是基於cookie進行信息處理的, 可是當訪問量過多,會佔用過多的服務器資源。
什麼是 token (令牌)
- 簡單 token 的組成: uid(用戶惟一的身份標識)、time(當前時間的時間戳)、sign(簽名,token 的前幾位以哈希算法壓縮成的必定長度的十六進制字符串)
- 特色:
- 服務端無狀態化、可擴展性好
- 支持移動端設備
- 安全
- 支持跨程序調用
token 的認證流程
- 客戶端使用用戶名、密碼作身份驗證;
- 服務端收到請求後進行身份驗證;(也多是統一登陸平臺、網關)
- 驗證成功後,服務端會簽發一個token 返回給客戶端;
- 客戶端收到Token之後能夠把它存儲起來(能夠放在);每次向服務端發送請求的時候,都要帶着Token;
- token 會有過時時間,過時後須要從新進行驗證;
- 服務端收到請求,會驗證客戶端請求裏面的Token,驗證成功,纔會響應客戶端的請求;
- 每一次請求都須要攜帶 token,須要把 token 放到 HTTP 的 Header 裏
- 基於 token 的用戶認證是一種服務端無狀態的認證方式,服務端不用存放 token 數據。用解析 token 的計算時間換取session 的存儲空間,從而減輕服務器的壓力,減小頻繁的查詢數據庫
- token 徹底由應用管理,因此它能夠避開同源策略
token 和 session 的區別
- session:保存在服務器中,服務器有資源開銷,分佈式、跨系統很差實現;
- Token:客戶端能夠將Token保存到任何地方,無限制,無狀態,利於分佈式部署。
- 過時時間:Session的過時時間存在cookie的Max-age字段,Token的過時時間存在服務器
- 使用範圍:Session-key的儲存依賴cookie機制,不能脫離瀏覽器;而Token能夠不依賴cookie。哪怕是在get/post請求的參數中帶上來均可以,因此不少第三方的登陸\支付等API接口都是用Token這種機制