Cookie和Session的作用和工作原理

本文详细介绍了Cookie和Session的概念、工作原理及其应用场景,并对比了两者之间的区别,包括存放位置、存取方式、安全性等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Cookie详解

(1)简介

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪储存在用户本地终端上的数据(通常经过加密)。

Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。


(2)工作原理

1、创建Cookie

当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:

①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象

②默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);

③将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中。

④发送该HTTP响应报文。

2、设置存储Cookie

浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。

3、发送Cookie

当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。

4、读取Cookie

 服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。

(3)作用

Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:

1、记住密码,下次自动登录。

2、购物车功能。

3、记录用户浏览数据,进行商品(广告)推荐。

(4)缺陷

①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。

②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)

③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。


二、Session详解

(1)简介

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。


Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

(2)工作原理

1、创建Session

当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。 

2、使用Session

我们知道在IE中,我们可以在工具的Internet选项中把Cookie禁止,那么会不会出现把客户端的Cookie禁止了,那么SESSIONID就无法再用了呢?找了一些资料说明,可以有其他机制在COOKIE被禁止时仍然能够把Session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面一种是作为URL路径的附加信息,表现形式为: 

http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764; 

另一种是作为查询字符串附加在URL后面,表现形式为: 

http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 

还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器。

(3)作用

Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:

1、判断用户是否登录。

2、购物车功能。


三、Cookie和Session的区别

1、存放位置不同

Cookie保存在客户端,Session保存在服务端。

2 、存取方式的不同

 Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 

而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 

3、安全性(隐私策略)的不同 

Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。 

4、有效期上的不同 

只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

5、对服务器造成的压力不同 

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

6、 跨域支持上的不同 

Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 


参考文献:

1、细说Cookie http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html#_label4

2、描述Cookie和Session的作用,区别和各自的应用范围,cookie、Session工作原理。

http://www.360doc.com/content/11/0706/15/3639038_131844581.shtml

3、深入理解HTTP Session http://lavasoft.blog.51cto.com/62575/275589/

4、Web应用中的Session知多少?http://www.blogjava.net/ohyeah928/archive/2010/01/27/310952.html

5、Cookie和Session的区别-总结很好的文章 http://www.lai18.com/content/407204.html

6、Cookie/Session机制详解 http://blog.youkuaiyun.com/fangaoxin/article/details/6952954

7、老生常谈session,cookie的区别,安全性 http://blog.51yip.com/php/938.html

8、Session和Cookie的区别及Session的生命周期 http://blog.youkuaiyun.com/shuaishenkkk/article/details/8634917

<think>嗯,用户问的是CookieSession工作原理,需要用中文来介绍。首先,我得回忆一下这两个概念的基本定义它们在Web开发中的作用Cookie是存储在客户端的小型数据片段,而Session则是服务器端用来跟踪用户状态的一种机制。不过,我需要更详细地梳理它们的工作流程区别。 首先,用户可能已经知道HTTP协议是无状态的,所以需要CookieSession来维持状态。但用户可能不太清楚它们具体是怎么工作的,或者它们之间如何协同。我得解释清楚这两者之间的关系,以及为什么需要两者同时存在。 接下来,我应该分步骤说明Cookie工作原理。当用户第一次访问网站时,服务器会通过响应头Set-CookieCookie发送到浏览器,之后浏览器每次请求都会带上这个Cookie。需要提到Cookie的常见属性,比如名称、值、过期时间、域名、路径等。可能还要提到安全性相关的属性,比如HttpOnlySecure。 然后是Session的部分。Session数据存储在服务器端,每个用户有一个唯一的Session ID,这个ID通常通过Cookie传递给客户端。当客户端发送请求时,服务器通过这个Session ID来找到对应的Session数据。这里需要强调Session依赖于Cookie,但也可以有其他方式,比如URL重写,不过最常见的是Cookie。 还要比较两者的区别,比如存储位置、安全性、存储容量限制等。用户可能关心为什么有时候用Cookie,有时候用Session,或者它们的优缺点。比如,Cookie存储在客户端,可能被篡改,而Session在服务器更安全,但会增加服务器负担。 另外,可能需要举一个用户登录的例子来说明整个过程。比如用户登录后,服务器创建Session,将Session ID通过Cookie发送给浏览器,之后的请求携带这个Cookie,服务器验证后维持登录状态。 还要注意可能的误区,比如Session不一定必须依赖Cookie,但大多数情况下是这样的。或者Session的数据存储位置,比如内存、数据库、文件系统等,根据服务器配置不同而不同。 用户可能想知道安全性问题,比如如何防止Session劫持,这时候可能需要提到使用SecureHttpOnly属性,或者定期更换Session ID等措施。 最后,总结两者的协作关系,以及它们如何共同解决HTTP无状态的问题,保持用户会话状态。确保语言通俗易懂,避免太多技术术语,但也要准确。</think>好的!Cookie Session 是 Web 开发中用于解决 HTTP 协议**无状态性**的关键技术,它们共同协作来跟踪用户的会话状态。以下是它们的工作原理区别: --- ### **Cookie(客户端存储)** **定义**:Cookie 是由服务器生成的一小段文本数据,存储在用户的浏览器中。每次用户访问网站时,浏览器会自动将 Cookie 附加到请求头中发送给服务器。 #### **工作原理**: 1. **服务器创建**:当用户首次访问网站时,服务器通过 HTTP 响应头的 `Set-Cookie` 字段发送 Cookie 到浏览器。 ```http HTTP/1.1 200 OK Set-Cookie: user_id=123; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Path=/; Secure; HttpOnly ``` 2. **浏览器存储**:浏览器将 Cookie 保存在本地(内存或硬盘,取决于过期时间)。 3. **自动发送**:后续用户每次请求该网站时,浏览器会自动将匹配的 Cookie 附加到请求头中: ```http GET /home HTTP/1.1 Cookie: user_id=123 ``` 4. **服务器读取**:服务器通过请求头的 Cookie 识别用户身份或状态。 #### **Cookie 的特性**: - **存储位置**:客户端(浏览器)。 - **容量限制**:通常每个域名下最多 4KB。 - **安全性**:可能被篡改(需结合加密或签名)。 - **常见用途**:保存登录凭证、用户偏好设置等。 --- ### **Session(服务器端存储)** **定义**:Session 是服务器用来存储用户会话信息的机制。服务器为每个用户分配一个唯一的 **Session ID**(通过 Cookie 或 URL 传递),并用此 ID 关联用户的数据。 #### **工作原理**: 1. **创建 Session**:用户首次访问时,服务器生成一个唯一的 Session ID,并创建对应的存储空间(如内存、数据库)。 2. **传递 Session ID**:服务器通过 `Set-Cookie` 将 Session ID 发送给浏览器(例如 `JSESSIONID=abc123`)。 3. **浏览器回传**:后续请求中,浏览器自动携带 Session ID(通过 Cookie 或 URL)。 4. **服务器验证**:服务器根据 Session ID 查找对应的 Session 数据,识别用户状态。 #### **Session 的特性**: - **存储位置**:服务器端(更安全)。 - **容量限制**:取决于服务器资源。 - **依赖 Cookie**:默认通过 Cookie 传递 Session ID(也可用 URL 重写,但不常见)。 - **常见用途**:保存登录状态、购物车内容等敏感信息。 --- ### **Cookie Session 的协作流程** 以用户登录为例: 1. 用户输入账号密码登录。 2. 服务器验证成功,创建 Session 数据(如用户角色、权限),生成 Session ID。 3. 服务器通过 `Set-Cookie` 将 Session ID 发送给浏览器。 4. 浏览器后续请求自动携带此 Cookie(含 Session ID)。 5. 服务器通过 Session ID 找到对应的 Session 数据,确认用户已登录。 --- ### **关键区别** | **特性** | Cookie | Session | |----------------|---------------------------------|-----------------------------| | **存储位置** | 客户端(浏览器) | 服务器端 | | **安全性** | 较低(可能被篡改) | 较高(数据在服务器) | | **存储容量** | 小(约 4KB/域名) | 大(受服务器资源限制) | | **性能影响** | 无(数据在客户端) | 可能影响服务器性能 | | **生命周期** | 可设置长期有效(如过期时间) | 通常随会话结束(如关闭浏览器)失效 | --- ### **安全问题** - **Cookie 泄露**:若被窃取(如 XSS 攻击),可能导致 Session 劫持。解决方案:使用 `HttpOnly`(防止 JS 读取)、`Secure`(仅 HTTPS 传输)。 - **Session 固定攻击**:攻击者强制用户使用已知的 Session ID。解决方案:登录后重置 Session ID。 --- ### **总结** - **Cookie** 是客户端存储的“钥匙”,**Session** 是服务器存储的“保险箱”。 - Cookie 适合存储非敏感信息(如用户偏好),Session 适合存储敏感数据(如登录状态)。 - 两者配合解决了 HTTP 无状态的问题,实现了用户会话的持续跟踪。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值