-->

2020年3月30日 星期一

SameSite cookie

踩雷:
因為登入資訊存在cookie中,smartpay付款完成後,導回指定頁面時,抓不到登入狀態的cookie,導致後續判斷有問題。

Chrome 80 之後的版本,預設的 Cookie 設定將會無法跨站存取 Cookie 值,若想要允許 Cookie 跨網站存取的話(SameSite = None),需要使用 HTTPS 才可以。

Cookie SameSite 有三種設定:
Strict:最嚴謹,完全禁止第三方 Cookie,跨網域時,任何情況下都不會發送 Cookie。只有與目前網頁網址一致才能發送。
Lax (default):稍微放寬,大多數情況也不發送第三方 cookie ,但Get請求可以。
None(需有 HTTPS 搭配,否則一樣等同 Lax):允許跨網域存取。
 關閉same-site-cookie default:
 chrome://flags/

參考:
https://web.dev/samesite-cookies-explained/
Chrome 80 後針對第三方 Cookie 的規則調整 (default SameSite=Lax)

同源政策 Same-origin policy

同源政策是在browser執行的。

同源定義:
同網域(Domain)
同通訊協定:HTTP, HTTPS, FTP
同連接埠號(Port)


目的:
防止惡意網站竊取數據。

限制:
Cookie、LocalStorage 和 IndexDB 無法存取。
DOM 無法獲得。
AJAX 請求不得發送。


2020年3月17日 星期二

Session vs Cookie



Session: 



特性:
  • 第一次訪問時, Server 為 Client 創建一個 session-id, 並把 session-id 回傳,存在 Client 的 Cookie中。
  • 下次訪問時,Client 會帶著 Cookie訪問,Server會檢查有沒有帶session-id。若有,會找出對應的文件,把訊息讀取出來 ,若沒有,會建立一個session-id。
  • session_destroy(),並清除cookie,這樣 Client、 Server就沒關係了。
優點:
  • 存於 Server,安全性高
缺點:
  • 效能問題,佔 Server記憶體資源 (每個用戶都要有自己的 session 文件,光找文件就耗不少資源)
  • Cookie 沒開的話, Session也不能用 (透過 php.ini 設定 session.use_trans_sid = 1,這樣 sessionID 就可以透過網址的方式傳回 server ,不用透過 cookie )。
失效時機:
    與php.ini設置相關 => session.cookie_lifetime = 0  //0表示cookie存活至瀏覽器關閉
                                  session.gc_probability = 1
                                  session.gc_divisor = 100
                                  session.gc_max_lifetime = 1440 //預設session逾時為24分鐘
檔案存放位置:
    與php.ini設置有關 => session.save_handler = file

Cookie:

特性:
  1. Cookie size 限制: 根據 RFC-2965 的規定,一個 Cookies 最大可以是 4096 bytes,而一個 domain 最多只能有 20 cookies
  2. 佔據網路流量: 由於每次 request 都必須將 Cookie 的資料放在 headers,所以當 Cookie 的資料變大時,request 也會跟著變大,過大的 request 會影響網路傳輸的速度。 
  3. Cookie 資料可被使用者竄改: 由於 Cookies 存在 browser 中,所以使用者可透過瀏覽器查看 Cookie 的資料以及其結構,當使用者任意竄改 Cookies 的資料時可能會導致資料外洩或者系統流程出錯。
Cookies 只能儲存結構簡單,容量小且無意義的資訊,且必須符合『同源政策』。