什麼是Cookie#############HTTP 是無狀態的協定(對於交易處理沒有記憶能力,每次客戶端和服務當端會話完成時,服務端不會保存任何會話訊息###):每個請求都是完全獨立的,服務端無法確認目前訪客的身份訊息,無法分辨上一次的請求發送者和這次的發送者是不是同一個人。所以伺服器與瀏覽器為了進行會話追蹤(知道是誰在訪問我),就必須主動的去維護一個狀態,這個狀態用於告知服務端前後兩個請求是否來自同一瀏覽器。而這個狀態需要透過 cookie 或 session 去實現。 #########cookie 儲存在客戶端:### cookie 是伺服器發送到使用者瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一伺服器重新發起請求時被攜帶並發送到伺服器上。 #########cookie 是不可跨域的:### 每個cookie 都會綁定單一的域名,無法在別的域名下取得使用,###一級域名和二級域名之間是允許共享使用的###(###靠的是domain)###。 ############cookie 重要的屬性#######
屬性 | 說明 |
---|---|
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 攻擊,不是絕對的安全性 |
|
相關專題推薦:php cookie(專題)
根據上述流程可知,SessionID 是連接 Cookie 和 Session 的一道橋樑,大部分系統也是根據此原理來驗證使用者登入狀態。
相關專題推薦:php session 會話(專題)
#
#jwt.io/
www.jsonwebtoken.io/
Authorization: Bearer <token>复制代码</token>
當使用者希望存取受保護的路由或資源的時候,可以把它放在Cookie 裡面自動發送,但是這樣不能跨域,所以更好的做法是放在HTTP 請求頭訊息的Authorization 欄位裡,使用Bearer 模式加入JWT。
GET /calendar/v1/events Host: api.example.com Authorization: Bearer <token>复制代码</token>
http://www.example.com/user?token=xxx复制代码
專案位址
相同:
區別:
#優點: 可容錯,各個伺服器間session 能夠即時回應。
缺點: 會對網路負荷造成一定壓力,如果 session 量大的話可能會造成網路阻塞,拖慢伺服器效能。
優點: 簡單,不需要對 session 做任何處理。
缺點: 缺乏容錯性,如果目前存取的伺服器發生故障,使用者被轉移到第二個伺服器上時,他的 session 資訊都會失效。
適用場景: 發生故障對客戶產生的影響較小;伺服器發生故障是低機率事件
。
實作方式: 以 Nginx 為例,在 upstream 模組配置 ip_hash 屬性即可實現黏性 session。
優點: 伺服器出現問題,session 不會遺失
缺點: 如果網站的存取量很大,把session 儲存到資料庫中,會對資料庫造成很大壓力,還需要增加額外的開銷維護資料庫。
不對。對 session 來說,除非程式通知伺服器刪除一個 session,否則伺服器會一直保留,程式一般都是在使用者做 log off 的時候發個指令去刪除 session。
然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session 機制都使用會話cookie 來儲存session id,而關閉瀏覽器後這個session id 就消失了,再次連接伺服器時也無法找到原來的session。如果伺服器設定的 cookie 被保存在硬碟上,或使用某種手段改寫瀏覽器發出的 HTTP 請求頭,把原來的 session id 傳送給伺服器,則再次開啟瀏覽器仍然能夠開啟原來的 session。
正是由於關閉瀏覽器不會導致session 被刪除,迫使伺服器為session 設定了一個失效時間,當距離客戶端上一次使用session 的時間超過這個失效時間時,伺服器就認為客戶端已經停止了活動,才會刪除session 以節省儲存空間。
在專案中使用JWT