1.Cookie
HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在浏览器的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器。Cookie使无状态的HTTP协议记录稳定的状态信息成为了可能。每个 Cookie 的大小一般不能超过4KB。
Cookie的常用场合:
- 会话(session)状态管理:保存登录、购物车等需要记录的信息。
- 个性化设置:如用户自定义设置、主题等
- 追踪:记录和分析用户行为。
Cookie 包含以下几方面的信息。
- Cookie 的名字
- Cookie 的值(真正的数据写在这里面)
- 到期时间
- 所属域名(默认是当前域名)
- 生效的路径(默认是当前网址)
浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie。
Cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie渐渐被淘汰。由于服务器指定Cookie后,浏览器的每次请求都会携带Cookie数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB 。
2.创建Cookie
当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie
选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie
请求头部将Cookie信息发送给服务器。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。
2.1 Set-Cookie响应头部和Cookie请求头部
服务器使用Set-Cookie
响应头部向浏览器发送Cookie信息。一个简单的Cookie可能像这样:
Set-Cookie: "xxx=dd"
服务器通过该头部告知浏览器保存属性为xxx
值为dd
的Cookie信息。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: xxx=dd
对该服务器发起的每一次新请求,浏览器都会将之前保存的Cookie再发送给服务器。
GET /sample_page.html HTTP/1.1
Host: www.example.com
Cookie: xxx=dd
2.2 会话期Cookie
会话期Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires
)或者有效期(Max-Age)。
2.3 Cookie有效期
和关闭浏览器便失效的会话期Cookie不同,Cookie可以指定一个特定的过期时间(Expires
)或有效期(Max-Age
)。
Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT;
当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
2.4 Cookie的Secure 和HttpOnly
标记为 Secure
的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。
为避免跨域脚本 (XSS) 攻击,通过JavaScript的 Document.cookie
API无法访问带有 HttpOnly
标记的Cookie,它们只应该发送给服务端。如果 Cookie 不想被客户端 JavaScript 脚本调用,那么就应该为其设置 HttpOnly
标记。
Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT; Secure; HttpOnly
2.5 Cookie的Domain和Path
Domain
标识指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain
,则一般包含子域名。
Path
标识指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。以"/" 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/xxx
,则以下地址都会匹配:
/xxx
/xxx/Web/
/xxx/Web/HTTP
2.6 JavaScript通过Document.cookies访问Cookie
通过Document.cookie
属性可创建新的Cookie,也可通过该属性访问非HttpOnly
标记的Cookie。