Cookie与SESSION有什么区别?

本文详细解析了Cookie和Session的概念、工作原理及其在Web开发中的应用,包括如何在用户计算机上保存信息、如何实现用户个性化服务以及它们之间的区别。重点介绍了如何在浏览器中管理Cookie和Session,以及在不同Web服务器环境中Session的有效性和局限性。

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

“Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。信息的片断以‘名/值’对(name-valuepairs)的形式储存。”

举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。

如果您使用IE浏览器访问Web,您会看到所有保存在您的硬盘上的Cookie。它们最常存放的地方是:c:\windows\cookies(在Win2000中则是C:\DocumentsandSettings\您的用户名\Cookies——作者注)。在我的机器上共有165个文件。每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的Web站点的信息。

在这个文件夹里的每个Cookie文件都是一个简单而又普通的文本文件。透过文件名,您可以看到是哪个Web站点在您的机器上放置了Cookie(当然站点信息在文件里也有保存)。您也能双击打开每一个Cookie文件。

比如,我访问了goto.com,而且这个站点在我的电脑上放了个Cookie。goto.com的Cookie文件包含了这样的内容:

UserIDA9A3BECE0563982Dwww.goto.com/

goto.com在我的电脑上存入了一个单一的“名/值”对。“名/值”对的“名”是UserID,“值”是A9A3BECE0563982D。在我第一次访问goto.com的时候,该网站为我分配了一个唯一的ID并存在我的电脑里。

(注:除了上面举例的“名/值”对,可能会有其它的“名/值”对同时保存下来。那是浏览器的一些内部信息,一般用户不必多做了解。)

Amazon.com在我的电脑上保存了稍稍多一些的信息。当我查看Amazon在我的电脑上建立的Cookie文件时,它包含以下内容:

session-id-time954242000amazon.com/ 
session-id002-4135256-7625846amazon.com/ 
x-maineKQIfwnxuF7qtmX52x6VWAXh@Ih6Uo5Hamazon.com/ 
ubid-main077-9263437-9645324amazon.com/

以上内容显示出Amazon存储了一个主用户IDubid-main,一个标记每次任务的IDsession-id及任务发生的时间session-id-time。还有一个x-main,不知道是什么。

大多数的网站在您的电脑上只保存一条信息,即用户ID。但一个站点可以用Cookie存储的“名/值”对的最大数目没有任何限制。

一个“名/值”对仅仅是一条命名的数据,它不是程序,也不能“做”任何事情。一个网站只能取得它放在您的电脑中的信息,它无法从其它的Cookie文件中取得信息,也无法得到您的电脑上的其它任何东西

英文直接翻译过来的意思呢就是小甜品 Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单。简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。

Cookie的使用很普遍,许多提供个人化服务的网站,都是利用Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是Web接口的免费E-mail网站,都要用到 Cookie。Cookie中记载的资料相有限,Cookie是安全的。网站不可能经由Cookie获得你的E-mail地址或是其它私人资料,更没有办法透过Cookie来存取你的计算机。但是如果你实在不喜欢Web服务器乱丢饼干(Cookie)到你家,当然可以让浏览器拒绝网站存放Cookie到你的计算机。只要在IE的“工具”菜单下选择“Intertnet选项”的“安全”,按自定义级别,将Cookie部分设为关闭,按确定,关闭浏览器,再重新启动浏览器即可。当你关闭Cookie之后,很多网站的个人化服务功能很可能也不能再使用了.

二session 简介

IE中:

有效的窗品包括

1.Session对象只在建立Session对象的窗口中有效。

2.在建立Session对象的窗口中新开链接的窗口

无效的窗口包括

1.直接启动IE浏览器的窗口

2.不是在建立Session对象的窗口中新开链接的窗口

NetScape中:

只要一个窗口有了某个Session对象,则全部窗口对此Session都有效

Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。

这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用,我们会在后面提及到。

除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说,最有用的还是可以通过访问ASP/ASP.NET的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入:

<% 
If Session("PageViewed") = ""Then 
Session("PageViewed") = 1 
Else 
Session("PageViewed") = Session("PageViewed") + 1 
End If 
%>

通过以下这句话可以让用户得知自己浏览了几个页面:

<% 
Response.Write("You have viewed " & Session("PageViewed") & " pages") 
%>

可能有些有些读者会问:这个看似像是数组的Session(“..”)是哪里来的?需要我定义吗?实际上,这个Session对象是具有ASP解释能力的的WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象,你只需要使用就行了。其中Session(“..”)中的..就好像变量名称,Session(“..”)=$$中的$$就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问..变量中的值了。

其实ASP一共内建了7个对象,有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象,只是叫法或者使用方法上不太一样。

ASP Session的功能的缺陷

目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP Session有以下缺陷:

进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?

Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。

鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET Session成为了一个更加强大的功能。

三 区别

Session是存在服务器端的;而Cookie是存在客户端的!!

Session更不需要Cookie来支持和不会受浏览器端的设置影响,可记录每个访问者的信息,独立在服务器端,比Cookie安全!

Session是存在内存中的,浏览器关闭它也就“死”了;Cookie是以文件方式存在的,可以修改其“存活”时间。


<think>我们正在讨论SessionCookie区别联系。根据用户提供的引用,我们可以总结如下: ### 区别: 1. **存储位置**: - Cookie存储在客户端(浏览器)[^2][^4]。 - Session存储在服务器端[^1][^2]。 2. **安全性**: - Cookie由于存储在客户端,容易被篡改或窃取(如XSS攻击)[^4]。 - Session存储在服务器端,相对更安全[^1]。 3. **数据类型**: - Cookie只能存储字符串类型的数据(存储其他类型需要转换成字符串)[^1]。 - Session可以存储任意数据类型(如对象)[^1]。 4. **有效期**: - Cookie可以设置长时间保持(例如通过`Expires`属性设置过期时间)[^1][^5]。 - Session一般有效期较短(例如客户端关闭或超时就会失效)[^1][^2]。 5. **存储大小**: - 单个Cookie大小通常不超过4KB(引用[1]提到3K,引用[4]提到4KB)[^1][^4]。 - Session可存储数据远大于Cookie,但过多使用会占用服务器资源[^1]。 ### 联系: 1. **Session依赖Cookie(通常)**: - 服务器创建Session时会生成一个唯一的Session ID,并通过Cookie(名为`JSESSIONID`或类似)发送给客户端[^1][^3]。 - 客户端后续请求会自动携带此Cookie,服务器通过Session ID找到对应的Session数据[^1][^3]。 2. **共同目标**: - 两者都用于跟踪用户状态,解决HTTP协议无状态的问题[^1][^2][^4]。 ### 示例说明: - **Cookie示例**:服务器设置一个名为`userid`的Cookie,客户端在后续请求中自动携带: ```csharp HttpCookie cookie = new HttpCookie("MyCook"); cookie.Expires = DateTime.Now.AddMinutes(1); // 1分钟后过期 cookie.Values.Add("userid", "value"); Response.AppendCookie(cookie); ``` 引用自[^5]。 - **Session依赖Cookie的证明**: 即使没有显式设置Cookie,使用`request.getCookies()`也会得到一个名为`JSESSIONID`的Cookie(由服务器自动创建)[^3]。 ### 总结: | 特性 | Cookie | Session | |--------------|-----------------------------|------------------------------| | 存储位置 | 客户端(浏览器) | 服务器端 | | 安全性 | 较低(易被篡改) | 较高(服务器存储) | | 数据类型 | 仅字符串 | 任意数据类型 | | 有效期 | 可长期保存(手动设置) | 短期(浏览器关闭或超时失效) | | 存储大小限制 | ≤4KB | 无硬性限制(但占用服务器资源)| | 主要联系 | Session ID 通常通过Cookie传递 | 依赖Cookie实现用户跟踪 | > ⚠️ 注意:虽然Session通常依赖Cookie传递Session ID,但也可通过URL重写(如`;jsessionid=...`)实现,但较少见。 §§相关问题§§ 1. 如何防止Session劫持? 2. Cookie有哪些安全属性(如HttpOnly, Secure)? 3. 如何在无Cookie环境下使用Session(如URL重写)? 4. Session存储的服务器端实现方式有哪些(内存、数据库等)?</think>### SessionCookie区别联系 #### 一、核心区别 1. **存储位置** - **Cookie**:存储在**客户端浏览器**中(如用户电脑)[^2][^4] - **Session**:存储在**服务器端**(如服务器内存或数据库)[^1][^2] 2. **数据类型大小** - **Cookie**: - 仅支持字符串类型数据 - 单个Cookie ≤ 4KB(实际通常≤3KB)[^1] - 示例:存储用户语言偏好 `lang=zh-CN` - **Session**: - 支持任意数据类型(对象、数组等) - 存储空间更大(受服务器资源限制)[^1] 3. **生命周期** - **Cookie**: - 可通过`Expires`属性设置长期保存(如登录保持)[^5] ```csharp // C# 设置1分钟过期的Cookie HttpCookie cookie = new HttpCookie("MyCook"); cookie.Expires = DateTime.Now.AddMinutes(1); ``` - **Session**: - 默认随浏览器关闭失效 - 服务器可设置超时时间(如30分钟无操作失效)[^1][^2] 4. **安全性** - **Cookie**: - 易被XSS攻击窃取(可通过JavaScript读取)[^4] - 需配合`HttpOnly``Secure`属性提升安全性 - **Session**: - 更安全(敏感数据不暴露在客户端) - 主要风险是Session ID被劫持[^1][^3] #### 二、核心联系 1. **协作机制** - Session依赖Cookie传递**Session ID**(通常名为`JSESSIONID`)[^1][^3] - 工作流程: ```mermaid graph LR A[用户登录] --> B[服务器创建Session] B --> C[生成Session ID] C --> D[通过Set-Cookie发送ID给浏览器] D --> E[浏览器后续请求携带Cookie] E --> F[服务器用ID查找Session数据] ``` 2. **状态管理互补** - Cookie存储轻量标识(如Session ID) - Session存储敏感/复杂数据(如登录凭证、购物车)[^1][^4] - 两者共同解决HTTP无状态问题 3. **ID传递方式** - 主要方式:Cookie自动携带Session ID(如`JSESSIONID=abc123`) - 备用方式:URL重写(当禁用Cookie时)[^3] #### 三、典型应用场景 | **场景** | **Cookie使用** | **Session使用** | |------------------|------------------------------|------------------------------| | 用户登录状态 | 存储加密的Session ID | 存储用户ID、权限角色 | | 购物车 | - | 存储商品列表、价格等对象 | | 个性化设置 | 存储语言/主题偏好(字符串) | - | | 防CSRF攻击 | 存储CSRF Token | 验证Token合法性 | > 💡 **关键结论**: > Cookie是客户端的"钥匙",Session是服务器端的"保险箱",Session ID是连接两者的桥梁[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值