簡單實作測試 SameSite 的規則(Lax,Strict,None)
Contents
因為測試 SameSite 需要用 https,要怎麼快速實作環境是一個重點。
實作環境
|
|
http://localhsot:5001
http://localhsot:5002
https://localhsot:6001
https://localhsot:6002
還可以看hosts
Windows 路徑在 C:\Windows\System32\drivers\etc
Linux 路徑在 /etc/
|
|
Docker Desktop 都幫我加上 host.docker.internal
了,所以就加減用了。
http://host.docker.internal:5001
http://host.docker.internal:5002
https://host.docker.internal:6001
https://host.docker.internal:6002
這樣不同 port 和多網域一次完成。注意這邊都連到同一個 container。所以session都是吃一樣,所以到正式環境會連到不同環境機器,這點可能需要考慮到。通常會用 redis 之類去解決,不過也不是每個公司都有這樣環境,所以也需要考慮,這邊就不討論了。
實作一個範例
SameSite 的 lax 需要用 https 才能存進去 client cookies。
- https://localhost:6001/setcookies.php 會寫一筆
- form.php 修改
method
GET或 POST - 進去 https://host.docker.internal:6001/form.php
- 查看執行結果
GET 會跑出cookies資料。
POST 會顯示空白頁面。
這有效防止 CORS 問題。
可以看這張圖測試。
Github: malagege/CookiesSameSiteDemo
心得
這麼簡單實作我們發現 Cookies 一些設定可以增加安全性,之前像我們後端做刪除文章功能,通常使用 POST,可能會說 GET 也能做到一樣的事情,但是 Lax 時候,就算從別的網站 Post 過來,使用者登入資訊 Cookies 不會加上到 Request 上面,可以預防這種事發生。
Info
這攻擊手法是CSRF。相關查詢可以Google或看這篇Chrome Cookie 政策調整與反思 | 魷型前端。
雖然現在前後端分離,最近在看這個可能沒有什麼用處。但在全端系統上,如何做到跨網域不重新登入,我覺得這個是滿重要議題。但最近很流行 OAuth 登入,有獨立做 Oauth Server也許也應用不到,基於技術好奇,我還是研究一下。