【Web基础】HTTP Cookie管理

HTTP Cookie & Set-Cookie 头部

当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。用户代理(一般是浏览器)收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。这种机制使得服务器能够在无状态的HTTP协议中维护稳定的状态信息。

服务器可以在一个响应中设置多个Set-Cookie头部,用于添加、更改、删除这些Cookies,而不能将多个Set-Cookie头部域合并成一个。

Set-Cookie头部域中的属性大小写不敏感,不能识别的属性会被丢弃掉,但不影响其他属性的存储。

会话期Cookie & 持久化Cookie

Set-Cookie时,如果不设置 Expires 或 Max-Age 指令,那么表示这是一个会话期 cookie ,否则是持久化 cookie。会话期 cookie 在一个会话结束时(即客户端被关闭时)会被移除。然而,很多Web浏览器支持会话恢复功能,可以使浏览器保留所有tab标签,然后在重新打开浏览器的时候将其还原。与此同时,cookie 也会恢复,就跟从来没有关闭浏览器一样。

Expires属性

Expires属性标识cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳。

Max-Age属性

Max-Age属性标识在 cookie 失效之前需要经过的秒数。秒数为 0 或 -1 将会使 cookie 直接过期。Max-Age 优先级高于Expires属性。

Domain属性

Domain属性指定 cookie 可以送达的主机名。如果没有定义,默认为当前文档位置的路径的域名部分,用户代理存储时会将该Cookie的host-only-flag标记为true,只有当前域名与该Cookie的Domain属性完全相等才可以进入后续流程。与之前的规范不同的是,域名之前的点号会被忽略。假如指定了域名,那么相当于各个子域名也包含在内了,用户代理存储时会将该Cookie的host-only-flag标记为false,即符合域规则(domain-matches)的域名都可以进入后续流程。
假如设置特定域的 cookie,不能涵盖原始服务器的域名,那么应该被用户代理拒绝。例如服务器在响应foo.example.com的请求时可以设置Domain属性为example.com或foo.example.com,但是不能设置为bar.example.com或baz.foo.example.com。

Path属性

Path属性指定一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 头部。如果没有定义,默认为当前文档位置的目录。

Secure & HttpOnly属性

服务器可以使用Secure和HttpOnly属性来提供额外的安全保护。标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端。如果包含服务端 Session 信息的 Cookie 不想被客户端 JavaScript 脚本调用,那么就应该为其设置 HttpOnly 标记。

注意:
Cookie对port和schema不提供隔离机制。
Cookie不校验兄弟domain或者子domain,例如服务器在响应http://example.com/foo/bar的请求时,可以设置Path为"/qux"的cookie。

Document.cookie

Document.cookie可供在网页中获取并设置与当前文档相关联的 cookie。

读取所有可从此位置访问的非HttpOnly标记的Cookie

allCookies = document.cookie;

在上面的代码中,allCookies被赋值为一个字符串,该字符串包含所有的Cookie,每条cookie以"分号和空格(; )"分隔(即, key=value 键值对),不包含除key=value以外的其他属性。

写一个新 cookie

document.cookie = newCookie;

newCookie是一个键值对形式的字符串。需要注意的是,用这个方法一次只能对一个cookie进行设置或更新。

修改和删除cookie

修改和删除cookie的条件

cookie的Name、Path和Domain必须匹配,才能修改和删除cookie。修改时,当前后两个cookie匹配时,会先删除前一个设置的cookie,再新增后面设置的cookie。

怎么删除一个cookie

服务器可以通过设置一个带有过期时间的Set-Cookie响应头部来删除一个cookie。
浏览器也可以通过一个带有过期时间的cookie字符串来赋值给Document.cookie来删除一个cookie。
只有当指定与之前创建cookie时相同的Path和Domain属性,才能删除这个cookie。

用户代理也可能因存储限制或隐私考虑而删除之前存储的cookies。

参考:

Cookies

Set-Cookie

Deleting a Cookie in JavaScript

HTTP State Management Mechanism

你可能感兴趣的:(Web,notes)