Cookie 的下发与回传

下发通过 Set-Cookie 响应头设置,后跟需要设置的 cookie 名 = 连接其值。再后面通过 ; 分隔的其他修改属性。

Set-Cookie: <cookie-name>=<cookie-value> 
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None

// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

同时下发多个 Cookie 时,可以像上面那个设置多个 Set-Cookie 响应头,也可以在一个响应头中完成。多个 Cookie 使用 , 分隔。

同个 Set-Cookie header 中设置多个 cookie name 的情况:

Set-Cookie: <cookie-name>=<cookie-value>; Attribute=value, <cookie-name>=<cookie-value>; Attribute=value, ...

示例:

Set-Cookie: user_id=5; Expires=Fri, 5 Oct 2018 14:28:00 GMT; Secure; HttpOnly, remember_me=true

注意,Cookie 的过期属性 Expires 其值会带逗号,在解析 Cookie 时需要特别处理,不要和用来分隔多个 Cookie 的逗号混淆。比如 Expires=Fri, 5 Oct 2018 14:28:00 GMT;

常用的 Cookie 属性:

  • Expires=<date>:设置 Cookie 过期时间,格式见此,示例:Sun, 16 May 2021 02:02:10 GMT,JS 中可通过 new Date().toUTCString() 生成。未设置则与 Session Cookie 等效,浏览器标签页关闭后失效。
  • Max-Age=<number>:过期时间,按秒算,如果同时设置了 Expires,此规则优先级更高。设置 0 或负值将使 Cookie 立即失效.
  • Domain=<domain-value>:允许发送 Cookie 的 domain 列表,缺省时为当前页面的 host。
  • Path=<path-value>:设置 Cookie 生效的路径。
  • Secure:只发送到 HTTPS 服务器。
  • HttpOnly:防止代码操作 Cookie,譬如 JavaScript 中通过 Document.cookie 来访问。
  • SameSite=<samesite-value>
    • Strict:同源情况下浏览器才发送该 Cookie
    • Lax:跨域加载图片或 iframe 时不发送 Cookie,点击链接会发送
    • None:同源与否均发送。

浏览器通过 Cookie 请求头回传 Cookie,回传时只回传 Cookie 名称和值,不回传 Cookie 属性。

Cookie: user_id=5; remember_me=true

需要注意,回传时用分号 ; 分隔多个 Cookie,而服务器下发时使用逗号 , 分隔多个 Cookie。 有点迷。

相关资源