美文网首页
关于Cookie

关于Cookie

作者: Chris__Liu | 来源:发表于2018-08-28 20:14 被阅读0次

    前言

    Cookie 是服务器保存在浏览器的一小段文本信息,每个 Cookie 的大小一般不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息,算是一种进入页面的入场券。

    特点:

    1. 服务器通过 Set-Cookie 响应头设置 Cookie
    2. 浏览器得到 Cookie 之后,每次请求都要带上 Cookie
    3. 服务器读取 Cookie 就知道登录用户的信息(email)

    作用:

    Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息。它的常用场合有以下一些。

    • 对话(session)管理:保存登录、购物车等需要记录的信息。
    • 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。
    • 追踪:记录和分析用户行为。

    有些开发者使用 Cookie 作为客户端储存。这样做虽然可行,但是并不推荐,因为 Cookie 的设计目标并不是这个,它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。

    Cookie 包含以下几方面的信息。

    • Cookie 的名字
    • Cookie 的值(真正的数据写在这里面)
    • 到期时间
    • 所属域名(默认是当前域名)
    • 生效的路径(默认是当前网址)

    举例来说,用户访问网址www.example.com,服务器在浏览器写入一个 Cookie。这个 Cookie 就会包含www.example.com这个域名,以及根路径/。这意味着,这个 Cookie 对该域名的根路径和它的所有子路径都有效。如果路径设为/forums,那么这个 Cookie 只有在访问www.example.com/forums及其子路径时才有效。以后,浏览器一旦访问这个路径,浏览器就会附上这段 Cookie 发送给服务器。

    浏览器可以设置不接受 Cookie,也可以设置不向服务器发送 Cookie。window.navigator.cookieEnabled属性返回一个布尔值,表示浏览器是否打开 Cookie 功能。

      // 浏览器是否打开 Cookie 功能
    window.navigator.cookieEnabled // true
    

    document.cookie属性返回当前网页的 Cookie。

    // 当前网页的 Cookie
    document.cookie
    

    不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30
    个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。

    浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie。注意,这里不要求协议相同。也就是说,http://example.com设置的 Cookie,可以被https://example.com读取。

    HTTP 回应:Cookie 的生成

    服务器如果希望在浏览器保存 Cookie,就要在 HTTP 回应的头信息里面,放置一个Set-Cookie字段。

    HTTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: yummy_cookie=choco
    Set-Cookie: tasty_cookie=strawberry
    
    [page content]
    

    除了 Cookie 的值,Set-Cookie字段还可以附加 Cookie 的属性。

    Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
    Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
    Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
    Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
    Set-Cookie: <cookie-name>=<cookie-value>; Secure
    Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
    

    如果服务器想改变一个早先设置的 Cookie,必须同时满足四个条件:Cookie 的key、domain、path和secure都匹配。举例来说,如果原始的 Cookie 是用如下的Set-Cookie设置的。

    Set-Cookie: key1=value1; domain=example.com; path=/blog
    

    改变上面这个 Cookie 的值,就必须使用同样的Set-Cookie。

    Set-Cookie: key1=value2; domain=example.com; path=/blog
    

    只要有一个属性不同,就会生成一个全新的 Cookie,而不是替换掉原来那个 Cookie。

    Set-Cookie: key1=value2; domain=example.com; path=/
    

    上面的命令设置了一个全新的同名 Cookie,但是path属性不一样。下一次访问example.com/blog的时候,浏览器将向服务器发送两个同名的 Cookie。

    Cookie: key1=value1; key1=value2
    

    上面代码的两个 Cookie 是同名的,匹配越精确的 Cookie 排在越前面。

    HTTP 请求:Cookie 的发送

    浏览器向服务器发送 HTTP 请求时,每个请求都会带上相应的 Cookie。也就是说,把服务器早前保存在浏览器的这段信息,再发回服务器。这时要使用 HTTP 头信息的Cookie字段。

    Cookie: foo=bar
    

    下面是一个例子:

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

    小结:

    Cookie主要功能是缓存浏览器中用户信息,不同浏览器会保存不同的Cookie,Cookie会被用户篡改,但通过Session可以防止篡改,所以独立的Cookie是不安全的,需要其他缓存机制来管理安全问题。

    相关文章

      网友评论

          本文标题:关于Cookie

          本文链接:https://www.haomeiwen.com/subject/fpnqwftx.html