什么是 Cookie

本文目录:

   1. Cookie 来由

   2. Cookie 用途

   3. 生命周期

   4. Cookie 工作机制

   5. Cookie 操作方法

   6. Cookie几种读取区别

   7. Cookie 跨域

 

 

1. Cookie 来由

      进入互联网时代,大部分的应用都基于互联网,采用B/S模式或者B/S与C/S结合的方式处理。但是http协议是无状态的协议,一个应用可能需要记录用户的登录状态、操作行为等等,那么就需要一个令牌一样的东西,记录客户端机器的相应的数据,因而Cookie诞生了。

 

2. Cookie 用途

      Cookie 是浏览器提供的一种机制, cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。在机器上体现为一个文本文件,cookie机制将信息以一个文本文件形式存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点。它可以用于以下几种场合。
      1.    保留用户的登录状态
      2.    跟踪用户的行为,进行相应的统计分析
      3.    定制用户的应用界面
等等,Cookie使用场合太多了。在当前的互联网应用中,如果禁用了Cookie,那是不可想象的,几乎是寸步难行。    

 

3. 生命周期

      Cookie 变量虽然存放在Client 端机器上,却也不是永远不会消失的。可以通过Cookie 的过期时间来处理(以Java为例)。过期的时间类型为Int型值,

       -1:表示本session有效,即在本浏览器打开的周期内有效,浏览器关闭后Cookie也被删除

      >=0: 表示Cookie的有效器,以秒为单位设置cookie 最大的有效时间,明确值指定cookie 将在多少秒过后失效。注意,这个值是cookie 有效期满的最大值,不是当前cookie 的存在时间。

 

4. Cookie 工作机制

      Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件 内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于 JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。

      其处理的步骤为:

      步骤一:在服务器端创建Cookie(客户端也是可以的,在服务端创建安全性高,这里以E网打进为例)

                 我们创建了一个名字为 COOKIE_EUP_TMP 的Cookie来包含访问者的信息,创建Cookie时设置:

 

             Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
             cookie.setDomain("cn.alisoft.com");
             cookie.setPath("/");
             cookie.setMaxAge(-1);
             this.getResponse().addCookie(cookie);

 

     注意: 在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,
完成浏览器的认证操作。

 

     此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如:

 

         Domain属性:能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。

         Expires属性:则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。

         Path属性:用来指定Cookie将被发送到服务器的哪一个目录路径下。

 

     说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

 

 

5. Cookie 操作方法

 

     java的写Cookie的方法:

 

Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");
cookie.setDomain("cn.alisoft.com");
cookie.setPath("/");
cookie.setMaxAge(-1);
this.getResponse().addCookie(cookie);

    删除Cookie的方法:

        指定 maxAge = 0 即可

 

    PS:在实际的使用中,Cookie值需要经过加密进行处理的,而且不能存储过多的数据,否则会影响页面的浏览速度。在web应用中,一般把静态资源(JS,CSS,IMAGE)等资源和web应用的域名分开来处理,那么静态资源就不会带有Cookie,能极大的提高Web应用的浏览速度。

 

6. Cookie几种读取区别

 

    下面以cn.alisoft.com域名为例,用几个域名来验证test.cn.alisoft.com,cn.alisoft.com,alisoft.com三个父子域名的读取区别:

 

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP 时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域test.cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域alisoft.com 新开浏览器执行读取,读不到 COOKIE_EUP_TMP 值

 

     另外我们增加Path的形式写入Cookie:

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP Path:/home  时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,在home目录下,可读到 COOKIE_EUP_TMP 值

                 在域cn.alisoft.com 新开浏览器执行读取,在search目录下,读不到 COOKIE_EUP_TMP 值

 

     结论:子域名可读父域名写入的Cookie,反之不行。如果设置了Path特性,那么只有这个Path路径下可读。

 

 

6. Cookie 跨域

     说到Cookie跨域,不得不说第一方Cookie和第三方Cookie,

      第一方Cookie:是来自当前正在查看的网站,或者发送到当前正在查看的网站。

      第三方Cookie :是来自当前正在查看的网站以外的网站,或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如,许多站点使用来自第三方网站的广告,或者iframe的别的网站的url,这些第三方的网站可能使用的Cookie

      下面以一个例子说明(第一方:www.b.com,第二方:www.a.com):

 

       描述:

 

          http://www.b.com/home/index.xsp 中iframe 嵌入了  http://www.a.com:8080/home/b.xsp

 

       操作步骤:

            步骤一:调用 http://www.a.com:8080/home/a.xsp写入 www.a.com 名称为:CookieName 的Cookie

            步骤二:在浏览器中输入:http://www.b.com/home/index.xsp ,内嵌的 http://www.a.com:8080/home/b.xsp 无法读取www.a.com的Cookie信息,这个就是跨域造成的。

 

       解决方法:

            在 http://www.a.com:8080/home/a.xsp 写Cookie的时候增加 P3P头:

this.getResponse().addHeader("P3P: CP", "CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV");

            重新在浏览器输入:http://www.b.com/home/index.xsp ,内嵌的 http://www.a.com:8080/home/b.xsp 就可以读到 www.a.com 写入的Cookie信息。

 

       PS:对于P3P,说起来就话长了,还不易说清楚,还是读者自己去查吧。公司的安全工程师说P3P头不安全,对于详细的不安全表现还不了解,待了解清楚后再续。

 

 

 

<think>我们正在讨论的是Cookie的基本概念及其在Web开发中的作用。根据引用内容,我们可以总结如下:引用[1]中提到:Cookie是一小段存储在浏览器(客户端)的文本信息。它由服务器在HTTP响应的Set-Cookie头部中发送给浏览器,并被客户端保存,并在后续的HTTP请求中发送回服务器。通常情况下,它被用来跟踪用户的状态、记录用户的偏好和实现购物车等功能。引用[2]指出:Cookie和Session是会话技术的核心,在B/S架构中,为了保存浏览器和服务器交互的数据(因为HTTP协议是无状态的)而产生了Cookie和Session技术。其中Cookie信息保存在浏览器中。引用[3]提到:Cookie就像网站和浏览器之间的信使,帮助网站记住你的信息,提供更加个性化的服务。引用[5]补充:cookie扮演着重要的角色用于在客户端存储和传递小型数据,常见于会话管理、用户认证以及个性化设置等场景。因此,我们可以这样回答:###什么是CookieCookie(中文常译为“小型文本文件”或“曲奇”)是由Web服务器发送到用户浏览器并保存在本地的一小段文本数据(通常不超过4KB)。浏览器会存储这些数据,并在后续向同一服务器发起的请求中携带该数据。Cookie是HTTP协议中用于实现会话状态管理的一种机制。###CookieWeb开发中的作用1.**会话管理**:保持用户登录状态(例如,用户登录后,服务器发送一个包含会话ID的Cookie浏览器在后续请求中携带该Cookie,服务器即可识别用户身份)[^1][^2]。2.**个性化设置**:存储用户偏好(如语言、主题等),实现定制化服务[^3]。3.**用户行为跟踪**:记录用户浏览行为(常用于广告推荐、网站分析)[^1]。4.**购物车功能**:在电商网站中暂存用户选择的商品信息[^1][^2]。###Cookie的工作原理1.**创建**:服务器通过HTTP响应的`Set-Cookie`头部发送Cookie信息到浏览器。```httpHTTP/1.1200OKSet-Cookie:user_id=12345;Max-Age=3600;Secure;HttpOnly```2.**存储**:浏览器Cookie保存到本地(内存或硬盘)。3.**发送**:后续请求同一域名时,浏览器自动在`Cookie`头部附加存储的Cookie。```httpGET/profileHTTP/1.1Cookie:user_id=12345```###安全注意事项-**敏感信息**:避免在Cookie中直接存储密码等敏感数据[^3]。-**安全属性**:建议设置`Secure`(仅HTTPS传输)、`HttpOnly`(禁止JavaScript访问)和`SameSite`(防范CSRF攻击)[^3][^5]。###示例:JavaScript操作Cookie前端可通过`document.cookie`读Cookie(需注意同源策略):```javascript//设置Cookiedocument.cookie="theme=dark;path=/;max-age=86400";//读取所有Cookieconstcookies=document.cookie;//返回"theme=dark;user_id=12345"```###相关问题1.Cookie和Session的主要区别是什么?2.如何设置Cookie的有效期?3.如何防止Cookie被窃取?4.Cookie在跨域请求中的行为是怎样的?[^1]:Cookie:HTTP会话管理的基础[^2]:Cookie和Session是会话技术的核心[^3]:JavaWebCookie详解[^5]:前端必备技能:全面解析CookieWeb开发中的应用</think>### 什么是 CookieCookie(中文常译为"小型文本文件")是由 Web 服务器发送到用户浏览器并保存在本地的一小段文本数据(通常不超过 4KB)。浏览器会存储这些数据,并在后续向同一服务器发起的请求中携带该数据。Cookie 是 HTTP 协议中用于实现会话状态管理的一种机制[^1][^2]。 #### Cookie 的基本特征: 1. **客户端存储**:保存在用户浏览器中(内存或硬盘) 2. **键值对格式**:以 `name=value` 形式存储数据 3. **域名绑定**:只能被创建它的域名访问 4. **有效期控制**:可设置过期时间(会话 Cookie 或持久 Cookie) 5. **大小限制**:通常每个 Cookie ≤ 4KB,每个域名下 ≤ 20 个 Cookie ### CookieWeb 开发中的作用 1. **会话状态管理** - 保持用户登录状态(最常见的用途) - 示例:用户登录后服务器返回包含会话 ID 的 Cookie,后续请求自动携带该 ID 以识别用户[^2] 2. **个性化设置存储** - 保存用户偏好(语言、主题、布局等) - 示例:`theme=dark` 存储夜间模式选择[^3] 3. **购物车功能实现** - 电商网站中暂存用户选择的商品 - 示例:`cart_items=[123,456]` 存储商品 ID 列表 4. **用户行为跟踪** - 记录用户浏览历史(需符合隐私政策) - 示例:广告平台使用第三方 Cookie 跨站跟踪 5. **认证令牌传递** - 在前后端分离架构中传递 JWT 等认证令牌 - 示例:`Authorization=Bearer xxxx.yyyy.zzzz` ### Cookie 工作原理示意图 ```mermaid sequenceDiagram 浏览器->>服务器: 请求登录 服务器->>浏览器: HTTP响应 + Set-Cookie: session_id=abc123 浏览器->>服务器: 后续请求 + Cookie: session_id=abc123 服务器->>浏览器: 返回个性化内容 ``` ### Cookie 创建示例 服务器通过 HTTP 响应头创建 Cookie: ```http HTTP/1.1 200 OK Set-Cookie: user_id=u12345; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure; HttpOnly; SameSite=Lax ``` ### JavaScript 操作 Cookie ```javascript // 设置 Cookie document.cookie = "theme=dark; max-age=2592000; path=/"; // 读取 Cookie const getCookie = (name) => { return document.cookie .split('; ') .find(row => row.startsWith(name)) ?.split('=')[1]; }; console.log(getCookie('theme')); // 输出: dark ``` ### 安全最佳实践[^3][^5] 1. **敏感信息**:避免存储密码、信用卡号等敏感数据 2. **HttpOnly 属性**:防止 XSS 攻击读取 Cookie ```http Set-Cookie: session_id=xyz; HttpOnly ``` 3. **Secure 属性**:仅通过 HTTPS 传输 4. **SameSite 属性**:防范 CSRF 攻击 5. **合理有效期**:设置适当的过期时间 ### 相关问题 1. Cookie 和 Session 的主要区别是什么? 2. 如何防止 Cookie 被窃取或篡改? 3. 现代 Web 应用中 Cookie 的替代方案有哪些? 4. 如何实现跨域 Cookie 的安全共享? 5. GDPR 等隐私法规对 Cookie 使用有哪些限制? [^1]: Cookie:HTTP会话管理的基础 [^2]: Cookie和Session是会话技术的核心 [^3]: Java WebCookie 详解 [^5]: 前端必备技能:全面解析 CookieWeb 开发中的应用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值