面试复盘之cookie属性

336 阅读3分钟

复盘

  • 今天某电商网站终面问到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.cookie API 无法访问带有 HttpOnly 属性的cookie
      • HttpOnly 类型的 Cookie 用于阻止了JavaScript 对其的访问性而能在一定程度上缓解此类攻击。
  • 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 标志。