深入理解Web开发中的Cookie与Session:原理与区别

发布时间:2024年01月20日

最近在电商项目中写到认证服务,用到了session来保存用户信息。对于cookie和session以及他们的作用之前一直很混淆,通过本篇文文章深入了解。

Cookie(HTTP Cookie)

1. 什么是Cookie?

Cookie是服务器发送到用户浏览器并保存在用户设备上的小型文本文件。它包含有关用户的信息,以便在用户访问同一网站时进行识别和跟踪。Cookie通常由服务器生成,然后通过HTTP协议发送到浏览器。

2. Cookie的工作原理:

1.创建和发送: 服务器通过HTTP响应头将Cookie发送到浏览器,浏览器收到后将其存储在本地。
2.存储位置: 存储位置可以是用户计算机上的文件,也可以是浏览器内部的数据库。
3.发送: 每次用户请求与该网站相关的资源时,浏览器都会自动将相应的Cookie通过HTTP请求头发送给服务器。

3. Cookie的特点:

有限期限: Cookie可以设置过期时间,超过该时间后将失效。
大小限制: 每个Cookie的大小通常有限制,通常在4KB左右。
跨域限制: Cookie有同源策略,不能被其他域的页面访问。

Session

1. 什么是Session?

Session是在服务器端存储的一种数据结构,用于跟踪用户的状态。与Cookie不同,Session数据存储在服务器上,而客户端的Cookie仅包含用于标识Session的会话标识符。

2. Session的工作原理:

会话标识符: 当用户首次访问服务器时,服务器会为其分配一个唯一的会话标识符,通常存储在Cookie中。
服务器端存储: 用户的状态信息存储在服务器上,而不是在用户的设备上。
会话管理: 服务器通过会话标识符来管理用户的状态,以确保用户在整个会话期间保持登录状态。

3. Session的特点:

安全性: 与Cookie相比,Session更安全,因为用户无法直接访问或修改服务器上的Session数据。
无大小限制: 服务器上的存储空间相对较大,因此可以存储更多的信息。
不受同源策略限制: Session数据存储在服务器上,不受同源策略的影响。

cookie和session配合使用认证流程

在这里插入图片描述

假设用户首次访问一个网站,该网站使用Cookie来识别用户并保持用户的登录状态。在用户成功登录后,服务器会生成一个包含用户身份信息的Cookie,并通过HTTP响应头将该Cookie发送给用户的浏览器。下面是一个简单的例子:

1.用户访问登录页面:

用户在浏览器中输入网站的地址,访问登录页面(例如,https://www.example.com/login)。

用户提交登录表单:

用户输入用户名和密码,并点击登录按钮。
服务器接收到登录请求,验证用户的身份。

服务器生成并发送Cookie:

如果用户的身份验证成功,服务器会生成一个包含用户标识信息的Cookie,并在HTTP响应头中添加Set-Cookie字段,将Cookie发送给用户的浏览器。

例如,HTTP响应头可能包含类似如下的内容:

HTTP/1.1 200 OK
Set-Cookie: user_id=123; expires=Wed, 17 Jan 2025 12:00:00 GMT; path=/
Content-Type: text/html
Content-Length: 100

<!-- 页面内容 -->

上述例子中,user_id=123是一个简化的表示用户身份的Cookie,它设置了过期时间为Wed, 17 Jan 2025 12:00:00 GMT,以及路径为/表示整个网站都可以访问这个Cookie。

浏览器存储Cookie:

  • 用户的浏览器收到HTTP响应后,会将Cookie存储在本地。以后用户访问同一域名下的资源时,浏览器会自动将这个Cookie通过HTTP请求头发送给服务器。

用户请求其他资源:

  • 用户点击网站上的其他链接或访问其他页面,浏览器会自动将之前存储的Cookie通过HTTP请求头发送给服务器。
GET /some-resource HTTP/1.1
Host: www.example.com
Cookie: user_id=123

<!-- 其他请求头 -->

服务器验证Cookie:

  • 服务器接收到包含Cookie的HTTP请求头后,会解析Cookie中的用户标识信息,并使用它来验证用户的身份。
  • 如果Cookie有效且未过期,服务器会认为用户已登录,并相应地处理用户的请求。

通过这个过程,网站能够保持用户的登录状态,而无需用户在每次请求时重新进行身份验证。这是一种常见的使用Cookie的场景,用于实现用户认证和会话管理。

文章来源:https://blog.csdn.net/Nanki_/article/details/135708198
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。