详细讲解Session、Cookie和token

区别

Session、Cookie和Token是Web开发中常用的身份验证和状态管理机制,用于跟踪用户会话和身份认证。它们分别有不同的实现方式和特点。

  1. Cookie:Cookie是一种存储在用户浏览器中的小型文本文件,由服务器在HTTP响应头中通过Set-Cookie标头发送给浏览器。浏览器在后续的每个请求中都会携带相应的Cookie信息,通过Cookie的名字来标识用户身份。Cookie通常用于记录用户的登录状态,跟踪用户的浏览历史,或者保存用户的偏好设置等。由于存储在浏览器中,Cookie对客户端是可见的,存在被篡改和劫持的风险。
  2. Session:Session是服务器端的会话状态管理机制,它在服务器上存储用户信息和状态,而不是像Cookie一样存储在客户端。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的Session ID,并将该ID通过Cookie发送给客户端,存储在浏览器中。后续的请求中,客户端会携带这个Session ID,服务器根据该ID找到对应的Session数据,实现状态管理和用户身份识别。Session数据存储在服务器内存或数据库中,相对于Cookie更加安全,但会占用服务器资源。
  3. Token:Token是一种用于身份验证和授权的令牌,由服务器生成,以明文或加密方式发送给客户端,通常存储在HTTP请求头中。Token可以包含用户身份信息、有效期、权限等数据,由于是在服务器端生成和验证,比Cookie更加安全。常见的Token包括JSON Web Token (JWT)和OAuth令牌。Token机制允许客户端保存状态,不依赖于服务器的会话存储,因此适用于无状态的RESTful API设计。

比较:

  • Cookie和Session都需要依赖服务器,由服务器生成和验证,Session存储在服务器端,Cookie存储在客户端。
  • Token是无状态的,服务器不需要存储会话信息,用户状态完全由Token携带,适用于分布式系统和无状态API设计。
  • Cookie和Session在实现上相对简单,适用于传统的Web应用,但对服务器资源有一定压力。
  • Token是一种更为灵活的身份验证方式,适用于前后端分离的应用和移动端应用。

在实际应用中,选择合适的身份验证和状态管理机制取决于应用的需求和设计架构。

cookie属性

Cookie是一种用于在浏览器端存储小型数据的机制,它可以让网站在用户访问时在浏览器中存储数据,并在后续请求中将这些数据发送回服务器。Cookie通常用于实现用户身份验证、跟踪用户行为、存储用户偏好等功能。

Cookie的属性主要有以下几个:

  1. 名称(name): 每个Cookie都有一个唯一的名称,用于标识Cookie。
  2. 值(value): 每个Cookie都有一个与之关联的值,存储在浏览器中。值可以是字符串、数字等类型。
  3. 域(domain): Cookie的域属性指定了哪些域名可以访问该Cookie。默认情况下,Cookie只在设置它的网站及其子域名中有效。
  4. 路径(path): Cookie的路径属性指定了哪些路径可以访问该Cookie。默认情况下,Cookie只在设置它的路径及其子路径中有效。
  5. 过期时间(expires或max-age): Cookie的过期时间属性指定了该Cookie何时过期,从而不再被浏览器存储。如果不设置过期时间,那么Cookie将成为会话Cookie,在用户关闭浏览器后自动删除。
  6. 安全标志(secure): 如果设置了安全标志,那么该Cookie只会在通过HTTPS安全协议的请求中发送,不会在HTTP请求中发送。
  7. HttpOnly属性(HttpOnly): 如果设置了HttpOnly属性,那么JavaScript将无法通过document.cookie访问该Cookie,这有助于防止XSS攻击。
  8. SameSite属性(SameSite): SameSite属性可以设置为"Strict"、"Lax"或"None",用于控制Cookie是否随跨站请求发送。"Strict"表示只有在请求目标与Cookie的域完全匹配时才发送,"Lax"表示在一些安全的GET请求中发送,"None"表示始终发送Cookie,但需要同时设置Secure属性。

设置Cookie的示例代码如下(使用JavaScript):

// 设置一个名为"username"的Cookie,值为"John Doe",过期时间为1天,作用域为当前网站的根目录
document.cookie = "username=John Doe; expires=" + new Date(Date.now() + 24 * 60 * 60 * 1000).toUTCString() + "; path=/";

// 设置一个安全的名为"token"的Cookie,值为"abc123",过期时间为30分钟,作用域为当前网站的子路径"/app",只在HTTPS请求中发送
document.cookie = "token=abc123; expires=" + new Date(Date.now() + 30 * 60 * 1000).toUTCString() + "; path=/app; secure";

// 设置一个HttpOnly的名为"sessionID"的Cookie,值为"xyz456",会话Cookie,作用域为当前网站的子域名".example.com"
document.cookie = "sessionID=xyz456; path=/; domain=.example.com; HttpOnly";

总结:Cookie是一种在浏览器端存储数据的机制,可以用于在网站和用户之间传递数据。通过设置Cookie的属性,我们可以控制Cookie的域、路径、过期时间、安全性等,以满足不同的业务需求。

拓展

token是怎么生成的?payload可以传密码吗?

Token 是一种用于身份验证和授权的令牌。在 Web 开发中,常用的 Token 类型包括 JSON Web Token(JWT)和 OAuth Token。

JWT Token 的生成过程:

  1. 用户登录时,服务器验证用户身份,生成包含用户信息的 JSON 对象,这个 JSON 对象就是 Payload。
  2. 将 Payload 和服务器的秘钥进行加密(通常使用 HMAC 算法或 RSA 加密算法),生成签名。
  3. 将 Payload 和签名拼接起来,中间用点号(.)连接,形成完整的 JWT Token。

JWT Token 的结构如下:

header.payload.signature

其中,header 是一个包含 Token 类型、加密算法等信息的 JSON 对象,payload 是用户信息等数据的 JSON 对象,signature 是签名,用于验证 Token 的完整性和真实性。

关于 Payload 是否可以传密码,一般不建议将密码直接放在 Token 的 Payload 中传递。因为 Token 是可以被解密的,如果将密码放在 Payload 中,那么这个密码可能会被恶意截获并被解密,造成安全风险。而且 Token 通常是以明文形式传输的,如果 Payload 中包含敏感信息,可能会导致信息泄漏。

通常情况下,Token 的 Payload 只包含一些用户的基本信息,比如用户ID、用户名、角色等,并不包含敏感信息。对于敏感信息,比如用户密码,应该使用安全的方式进行传输,比如在登录时使用 HTTPS 协议加密传输,或者在服务端使用一次性的授权码等方式进行安全处理。

全部评论
兄弟们别光收藏,要多看多背,收藏了不等于会了😅
1 回复 分享
发布于 2023-08-25 10:55 广东

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
评论
8
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务