复盘
- 今天某电商网站终面问到cookies的属性问题,有点不知所措,因为cookies自己应用蛮少的
- 在这里进行cookies的复盘
- cookies的作用
- 会话状态管理(如用户登录、购物车、游戏分数或其他的游戏分数、其他需要记录的信息)
- 个性化设置,程序主题色
- 浏览器跟踪(如跟踪用户行为)
创建cookies
- 服务端
- set-cookies:
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: tasty_cookie=strawberry- NodeJS设置方式
response.setHeader('Set-Cookie', ['foo=bar', 'bar=baz']); - 会话区的cookies是简单的cookies:
- 随着浏览器的关闭而自动删除,仅在会话期有效,会话区的cookies不需要设置Expires(过期时间)或者Max-Age(有效期),有些浏览器提供了会话恢复功能,在会话关闭后也不会删除相关的cookies,cookies就相当于无限期延长
- 持久化的cookie
- 一般需要设置max-age(有效期)或者expire(过期时间)
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;- 当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。
- 两个属性可以确保cookie被意外的参与者或者脚本访问
- Secure
- 标记为Secure属性的只应该通过HTTPS协议加密过的请求发送,发送给服务端,因此可以预防中间者的攻击,Secure也无法保证确实安全,cookie有固有的问题,例如可以从客户端硬盘读取
从 Chrome 52 和 Firefox 52 开始,不安全的站点(`http:`)无法使用Cookie的 `Secure` 标记 - HttpOnly
- JavaScript
Document.cookieAPI 无法访问带有HttpOnly属性的cookie HttpOnly类型的 Cookie 用于阻止了JavaScript 对其的访问性而能在一定程度上缓解此类攻击。
- JavaScript
- Secure
domain属性和Path属性决定了其作用域- domian指定了那些主机可以接受cookie,不指定,则默认为origin(不包含子域)
- domain如果指定了域,那么其包含子域,因为指定domain的限制更少一些,
- 当前大多数浏览器遵循 RFC 6265,设置 Domain 时 不需要加前导点。浏览器不遵循该规范,则需要加前导点,例如:
Domain=.mozilla.org
Path属性- 决定了主机下的那些路径可以接受cookie(该url路径存在于URL),以字符%x2F作为路径分隔符
- 例如以下规则
- 例
docus其实以下都可以匹配- /docus/html
- /docus/secure
-
SameSite
- 例
- SameSite cookie允许服务器要求某个cookie在跨站时不会被发送
- Strict浏览器只在访问相同站点发送cookie,从而可以阻止跨站请求伪造攻击
None浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。Lax。 与Strict类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接- 通过 JavaScript 创建的 Cookie 不能包含 HttpOnly 标志。