PJCHENder 未整理筆記

[Note] Session & Cookie

2020-05-18

[Note] Session & Cookie

傳統上指稱的 Session 是存放在伺服器上的,Client 的 request 中帶著的 Cookie,這個 Cookie 內包含 session_id 的訊息,server 便可以透過此 session_id 去查找伺服器上 Session 資料表內,找出該使用者的身份為何。

What is the difference between localStorage, sessionStorage, session and cookies? @ StackOverflow

待參考:👍 HTTP Cookie

1
2
3
4
5
6
7
8
9
Set-Cookie:
cookieKey=cookieValue; # key-value pair
expires=Tue, 09 Jun 2020 15:46:52 GMT; # 過期時間
Max-Age=1209600; # 最常有效時間(優先權較高)
Path=/about/; # 只限定作用在某個 path,預設是 "/"
Domain=api.pjchender.com; # 只限定作用在某個 domain
Secure; # 只能在 HTTPS 的協定下傳送此 Cookie
HttpOnly; # 不能透過 Document.cookie 這種 JS 的方式讀取 Cookie
SameSite=Lax; # 包含 Lax, Strict, None,跨站情況下是否要傳送該 Cookie

Expires 和 Max-Age 的設定

  • 當同時設定 expiresMax-Age 時,Max-Age 有比較高的優先權。

Domain 的設定

  • 當不在該 Domain 的環境下,卻針對其他 Domain 設定 Cookie 時會無效。舉例來說,在 pjchender.blogspot.com 中透過 Set-Cookie 試圖設定 Domain=pjchender.github.io 時,會沒有作用,瀏覽器會拒絕這個 Cookie。
  • 一般的情況下,若設定 Domain=pjchender.com 那麼不論所處的 subdomain 為何(例如,info.pjchender.com, dev.pjchender.com)都可以成功設定此 Cookie。但當這個 domain 是列在 Public Suffix List 中時,會有例外的情況,以 github.io 為例,即使我在 pjchender.github.io 這個網域,但因為 github.io 是被列在 Public Suffix List 中,因此將不能設定 Domain=github.io,此 Cookie 設定會無效,並且被瀏覽器拒絕。

AJAX 請求

  • 當 AJAX 發送請求的來源和目標 domain 相同時,瀏覽器會在請求中帶入目標 domain 的 credentials(即,Cookie)。

  • 若來源和目標 domain 不同時,設定的情況下瀏覽器不會把 credentials(即,Cookie)添加到該請求中,除非在 AJAX 的請求中加上 credentials: "include" 的參數,例如:

    1
    2
    3
    fetch('https://www.pjchender.com', {
    credentials: 'include',
    });

    同時在 server 的部分,若想要順利處理此請求,需要在 header 中給予 Access-Control-Allow-CredentialsAccess-Control-Allow-Origin 的設定。

參考

掃描二維條碼,分享此文章