zoukankan      html  css  js  c++  java
  • Cookie

    一、概述

    MDN|HTTP cookies

    Cookie,通常指的是 HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie),Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明,它是一小段文本(通常很小,不超过4kb),可以保存在浏览器,其上承载了某些信息。
    目的是为了保存一些状态信息,因为http是无状态的,主要有三个用途:

    1. 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
    2. 个性化设置(如用户自定义设置、主题等)
    3. 浏览器行为跟踪(如跟踪分析用户行为等)

    Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB

    二、格式

    2.1 基本格式

    Cookie只是一段文本而已,但是内容有格式要求:键值对形式,相互之间以分号 ; 隔开。
    以下是某个请求报文中cookie的部分截图:
    图片名称

    2.2 内置的键值对

    有些比较重要的键值对,它会影响浏览器对Cookie的管理:

    • Expires: 设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效。

    • Domain: 指定了可以访问该 Cookie 的 Web 站点或域。Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。当需要实现单点登录方案时,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻击的危险,比如攻击者可以借此发动会话定置攻击。因而,浏览器禁止在 Domain 属性中设置.org、.com 等通用顶级域名、以及在国家及地区顶级域下注册的二级域名,以减小攻击发生的范围(注意什么是domin,domin即域,通常指的是域名,比如cnblogs.com是父域名,i.cnblogs.com是子域名)

    • Path: 为了在HTTP请求头设置Cookie,所要设置的路径(即我们所说的url,网址中除了域名的那一部分,不含参数)。如果设置了 Path=/docs,那么其下的/docs/docs/Web//docs/Web/HTTP等等都会被匹配

    • Secure: 指定是否使用HTTPS安全协议发送Cookie

    • HTTPOnly: 指定是否允许客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头

    三、生命周期

    一般而言,用户很难体验到cookie的存在,一个网站可以有多个cookie。如果用户禁止了cookie,那么便不能生成cookie。

    3.1 Cookie生成

    Cookie的创建从用户第一次请求服务器起开始,服务器将会在响应头添加Set-Cookie选项(可以重复):

    HTTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly

    ...

    浏览器收到响应后通常会保存下 Cookie,注意 Cookie 上如果有设置信息,则会影响 Cookie 存活阶段的行为。

    根据 Cookie 的设置,所有符合设置的 http 请求会自动携带上 Cookie。注意,根据浏览器的安全策略,不管是同域还是跨域,ajax生成的Http请求不会自动携带 Cookie!
    这就是为什么有些新手(比如一年前的我)在编辑服务器代码时,出现session失效的问题。原因就是服务器的session一般是基于 Cookie实现的(sessionId存放在Cookie上面),没有sessionId便无法判断session是不是当前用户的,所以找不到session。
    想要携带Cookie的话,浏览器端的ajax请求得设置withCredentials,服务器也得设置响应头Access-Control-Allow-Credentials: true

    Cookie未设置过期时间(Expires属性)的话,将会在浏览器关闭的时候在内存中清除。
    如果设置了时间且关闭浏览器的时候还没有到过期时间,浏览器会将Cookie生成为一个文件,存放在指定的位置,下次打开浏览器的时候就会重新激活取出。

  • 相关阅读:
    Linux学习笔记(第一章)
    C#中的抽象类有什么好处?究竟它是用来干事什么的呢?
    C#中的 增 、删、 改、 查功能
    在Visual C#中用ListView显示数据记录
    10.14JDBC之数据库连接池之C3P0
    10.19JDBC之使用C3P0连接池重新实现JDBCUtils方法
    10.12JDBC之DAO实现类的优化
    10.13JDBC之数据库连接池
    RhinoMock入门(3)——4种Mock类型
    wse说谈(3)——策略,用户令牌
  • 原文地址:https://www.cnblogs.com/panshaojun/p/14892239.html
Copyright © 2011-2022 走看看