HTTP Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,他会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。
Cookie 主要用于以下三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其他需要记录的信息)
- 个性化设置(如用户自定义设置/主题等)
- 浏览器行为跟踪
创建Cookie
服务器可以在响应头里面添加一个Set-Cookie
选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过cookie请求头部将cookie信息发送给服务器。另外,Cookie 的过期时间、域、路径、有效日期、适用站点都可以根据需要来指定。
服务器使用Set-Cookie
响应头部向浏览器发送Cookie信息。简单的例子:
Set-Cookie: <cookie名>=<cookie值>
会话期Cookie
最简单的Cookie,浏览器关闭之后会自动删除。会话期Cookie无需指定过期时间(Expires
)或者有效期(Max-Age
)。
持久性Cookie
可以指定一个特定的过期时间或有效期
Set-Cookie: id=a3fwa; Expires=Wed,21 Oct 2015 07:28:00 GMT;
提示:当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
Cookie 的 Secure 和 HttpOnly 标记
标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过Cookie传输,因为Cookie有其固有的不安全性,Secure 标记也无法提供确实的安全保障。
为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie
API无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端。如果包含服务端 Session 信息的 Cookie 不想被客户端 JavaScript 脚本调用,那么就应该为其设置 HttpOnly 标记。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
Cookie的作用域
Domain
和 path
标识定义了Cookie的作用域:即Cookie应该发送给哪些URL。
Domain
标识指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain,则一般包含子域名。
Path
标识指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs,则以下地址都会匹配:
- /docs
- /docs/Web/
- /docs/Web/HTTP
JacaScript 通过 document.cookies 访问 Cookie
通过Document.cookie
属性可创建新的Cookie,也可通过该属性访问非HttpOnly标记的Cookie。
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"