Cookie 和 Session 有什么区别?

157

我正在学习Web开发,了解JSPServlets。我对HttpSession有一定的了解-在我的一些示例项目中使用过它。

在浏览器中,我看到了“删除Cookie”的选项。如果我删除Cookie,也会删除HttpSession

Cookie和Session是相同的吗?它们之间有什么区别?


还可以参考这个问题:https://dev59.com/uXRC5IYBdhLWcg3wROtQ,特别是有关签名 cookie 的注释。 - Joel Coehoorn
我认为这个问题的第二个答案更加恰当,如果您将其选为最佳答案,许多人将会阅读它。 - Suraj Jain
9个回答

309
一条cookie是一个简短的文本字符串,用于在客户端和服务器之间传递。您可以将name=bob; password=asdfas存储在cookie中并来回发送以识别服务器端的客户端。您可以将其视为与没有短期记忆的银行出纳员进行交流,并需要您为每个交易都进行身份验证。当然,使用cookie存储此类信息是非常不安全的。Cookie的大小也受限制。
现在,当银行出纳员知道他/她的记忆问题时,可以在一张纸上写下您的信息并分配给您一个短ID号码。然后,您只需说“我是客户端12”,而不必为每个交易提供帐户号码和驾驶执照。
将其翻译成Web服务器的语言:服务器将在会话对象中存储相关信息,并创建会话ID并将其作为cookie发送回客户端。当客户端发送回cookie时,服务器可以使用ID查找会话对象。因此,如果删除cookie,则会话将丢失。
还有一种替代方案是使用URL重写来交换会话ID。
假设您有一个链接- www.myserver.com/myApp.jsp。您可以通过页面并将每个URL重写为www.myserver.com/myApp.jsp?sessionID=asdf甚至www.myserver.com/asdf/myApp.jsp并以此方式交换标识符。这种技术由Web应用程序容器处理,并且通常通过设置配置使用无cookie会话来启用。

29
这是一个妙趣横生的解释,借助一个非常贴切的现实世界类比做阐述。这个回答本应该得到更多的赞同。对于那些最有可能提出这样问题的新手来说,非常易于理解。 - user798719
2
如果我是一个用户,有人知道了我的会话ID会发生什么? - Maria Ines Parnisari
3
可能会有人冒充你。在在线赌博场景中发生过这种情况——嗅探旅馆的WiFi信号,窃取会话ID,然后访问账户。保护会话的安全则是另外一个故事了。 - Chris Cudmore
2
那么,谁首先创建 Cookie 呢?服务器还是客户端?或者这取决于应用程序?(我认为是服务器,否则会带来安全威胁,但值得一提吗?) - nha
4
服务器创建会话并在响应中传递cookie,会话的创建取决于应用程序逻辑何时需要创建它。客户端也可以创建cookie,但在识别会话的情况下可能没有太大用处,因为服务器可能不知道值在会话中代表什么。 - Azeem
关于最后一段关于将会话ID放入URL中的问题。最好阅读一下为什么应该避免这样做:https://security.stackexchange.com/questions/14093/why-is-passing-the-session-id-as-url-parameter-insecure - John

183
会话是保存用户信息的服务器端文件,而Cookie是保存用户信息的客户端文件。会话具有将其映射到特定用户的唯一标识符。此标识符可以在URL中传递或保存在会话Cookie中。
大多数现代网站使用第二种方法,将标识符保存在Cookie中,而不是在URL中传递(这会带来安全风险)。您可能正在使用此方法而不知道,通过删除Cookie,您会有效地擦除它们所匹配的会话,因为您删除了Cookie中包含的唯一会话标识符。

10
“将其放入URL中(这会带来安全风险)。”实际上,这两种方法都存在安全风险(不同的安全风险)。如果正确执行,并且用户明白该URL是保密的以及永远不能在公共论坛上发布,那么“URL中的秘密ID”可以变得更加安全。 - curiousguy
1
标识符可以通过URL传递或保存到会话Cookie中。在客户端或服务器端?谢谢您进一步澄清。 - Adib Aroui
4
会话 cookie 存储在客户端上(其值包含唯一的会话标识符,该标识符随着每个请求发送以将浏览器会话映射到服务器上的用户会话)。 - WynandB

6

6

Cookie和Session都用于存储用户信息(以实现HTTP请求的状态保持),但不同之处在于Cookie将信息存储在客户端(浏览器)上,而Session则将信息存储在服务器端。Cookie的局限在于它只能存储有限数量的用户信息,并且每个用户只能存储有限内容。而Session则没有这样的限制。


1

Cookie基本上是一个全局数组,可以在Web浏览器之间访问。很多时候用于发送/接收值。它作为一种存储机制,用于在表单之间访问值。浏览器可以禁用Cookie,这与会话的使用相比增加了限制。

会话可以定义为登录和注销之间的某些事情。用户登录和注销之间的时间是一个会话。会话仅在会话时间内存储值,即在注销之前。 会话用于跟踪用户的活动,一旦他登录。


0

Cookies以文本文件格式存储在浏览器中。它只能存储有限数量的数据,最多只允许4kb [4096字节]。$_COOKIE变量不会保存具有相同名称的多个cookie。

我们可以轻松地访问cookie的值。因此,它的安全性较低setcookie()函数必须出现在之前。

<html> 

标签。

会话存储在服务器端。它可以存储无限量的数据。它能够在会话中保存多个变量。我们不能轻易地访问 cookie 值。因此,它更加安全。


其实,你可以在cookies中保存多个数据。另外,session并不能真正地保存无限量的数据。你的限制基本上是由你拥有的内存量所决定的。 - Koray Tugay

0

Cookie是在客户端和服务器之间实现会话的一种方式,通过这种方式,会话信息存储在cookie中。但这不是保存会话信息的唯一方式,另一种方式是将会话信息存储在URL中。


0

Google JSESSIONID。这将解释Servlet API最初如何使用URL重写,然后(如果启用了cookies)使用cookie来管理会话。

HTTP是无状态的,因此客户端浏览器必须在每个请求中向服务器发送其会话ID。服务器通过任何手段使用此ID检索该会话的任何数据,使其在请求的生命周期内可用。


0

Asp.net中的会话:

1.在整个应用程序中保持数据。

2.如果当前会话仍然存在,则保留数据。如果我们需要从多个控制器操作和视图中访问某些数据,则会话是存储和检索数据的方法。

3.会话是包含用户信息的服务器端文件。[会话是唯一标识符,将它们映射到特定用户]

将其翻译为Web服务器:服务器将在会话对象中存储相关信息,并创建一个会话ID,将其作为cookie发送回客户端。当客户端发送回cookie时,服务器可以使用该ID简单地查找会话对象。因此,如果删除cookie,则会话将丢失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接