cookie的幾個屬性
1 httpOnly:true 表示禁止客戶端讀cookie,即只能在服務端讀取它
2 SameSite:用來限制第三方 Cookie,從而減少安全風險。
- Strict最為嚴格,完全禁止第三方 Cookie,跨站點時,任何情況下都不會發送 Cookie。換言之,只有當前網頁的 URL 與請求目標一致,才會帶上 Cookie。
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
- Lax規則稍稍放寬,大多數情況也是不發送第三方 Cookie,但是導航到目標網址的 Get 請求除外。
導航到目標網址的 GET 請求,只包括三種情況:鏈接,預加載請求,GET 表單。詳見下表。
Set-Cookie: CookieName=CookieValue; SameSite=Lax;
- Chrome 計划將Lax變為默認設置。這時,網站可以選擇顯式關閉SameSite屬性,將其設為None。不過,前提是必須同時設置Secure屬性(Cookie 只能通過 HTTPS 協議發送),否則無效。
Set-Cookie: widget_session=abc123; SameSite=None; Secure
需要明確的
- 跨域之后,不能讀寫cookie,例如a網站的cookie,b網站不能讀到
- samesite:none可以讓c網站的cookie,由不能的調用方共享修改,例如a網站操作c網站,c網站寫自己的cookie,而b網站也操作c網站,這時c網站的cookie里是可以包含a網站的操作內容的
在keycloak中的應用
keycloak中的cookie,它的會話狀態使用了SameSite,從而在由一個網站到別一個網站時,如果你已經登錄,那這些登錄信息會帶到另一個網站去,這是由SameSite特性決定的,和開發的程序無關,我們之間使用kc的session通訊
Secure屬性說明
Secure屬性是說如果一個cookie被設置了Secure=true,那么這個cookie只能用https協議發送給服務器,用http協議是不發送的。換句話說,cookie是在https的情況下創建的,
而且他的Secure=true,那么之后你一直用https訪問其他的頁面(比如登錄之后點擊其他子頁面),cookie會被發送到服務器,你無需重新登錄就可以跳轉到其他頁面。但是如果這
是你把url改成http協議訪問其他頁面,你就需要重新登錄了,因為這個cookie不能在http協議中發送,事實上,對於samesite屬性為None時,因為只有secure為true它才合法,
所以這samesite=None也只能應用在https環境里。
https已經很安全,所以在它里面可以用 Samesite=None;Secure=true
瀏覽器對samesite和secure的默認值設置不同
- 谷歌
- 火狐
火狐這塊更加寬松,跨站的cookie,http協議方式也是可以讀到的,谷歌是不可以的。