cookie
先举一个通俗易懂的生活例子:
想象你去一家经常光顾的咖啡店,咖啡店的店员为了更好地服务你,给了你一张带有你名字和一些信息的卡片(这就相当于服务器给浏览器发送的 Cookie)。卡片上可能写着你喜欢的咖啡口味、你上次消费的金额等信息。
当你下次再去咖啡店时,你会把这张卡片拿给店员看(浏览器在下次请求时把 Cookie 发送给服务器),店员看到卡片后就知道你是谁,知道你喜欢的咖啡口味,然后可以根据这些信息为你提供服务,比如直接为你制作你喜欢的咖啡,而不需要你再重复说明。
如果这张卡片上只记录了你在这次咖啡店之行中的信息,当你离开咖啡店后,卡片就被扔掉了,这就类似于会话 Cookie,它只在你这次访问咖啡店(浏览器会话)期间有效,你关闭浏览器(离开咖啡店)后就被删除了。
但如果这张卡片是可以多次使用的,并且有一个有效期,你可以在下次来咖啡店时继续使用它,直到它过期,这就类似于持久 Cookie,它会在你的电脑(或其他设备)上保存一段时间,直到达到指定的过期时间或者你手动删除它。
不过,这张卡片也存在一些风险。如果被别人偷走了,别人就可能知道你喜欢的咖啡口味,甚至可能冒充你去咖啡店消费(信息泄露和会话劫持风险)。另外,如果咖啡店被坏人利用,在你看卡片的时候,偷偷在卡片上添加一些不好的信息,然后你下次拿给店员看时,店员可能会被误导,这就类似跨站脚本攻击(XSS)风险。
准确来说:
定义
Cookie 是由服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带上并发送到服务器上。本质上,它是服务器存储在用户浏览器端的文本信息,用于在客户端和服务器之间传递一些必要的数据。
工作原理
- 创建:当用户访问支持 Cookie 的网站时,服务器会在响应头中添加一个
Set - Cookie
字段,其中包含要存储的 Cookie 信息,如名称、值、过期时间、域名等。例如:Set - Cookie: user_id = 123; Expires = Wed, 21 Oct 2025 07:28:00 GMT; Domain =.example.com
。- 存储:浏览器接收到服务器的响应后,会解析
Set - Cookie
字段,并将 Cookie 信息存储在本地。存储位置和方式因浏览器而异。- 发送:当浏览器再次向同一服务器发起请求时,会在请求头中添加
Cookie
字段,将之前存储的 Cookie 信息发送给服务器。例如:Cookie: user_id = 123
。- 处理:服务器接收到请求后,会解析
Cookie
字段,获取其中的信息,并根据这些信息进行相应的处理,如识别用户身份、记录用户偏好等。使用场景
- 会话管理:用于保持用户的登录状态。当用户登录网站后,服务器会创建一个包含用户标识的 Cookie,浏览器在后续请求中携带该 Cookie,服务器据此识别用户身份,无需用户每次都重新登录。
- 个性化设置:记录用户的个性化偏好,如页面语言、字体大小、主题颜色等。当用户再次访问网站时,服务器可以根据 Cookie 中的信息为用户提供个性化的界面。
- 购物车功能:在电子商务网站中,使用 Cookie 记录用户添加到购物车中的商品信息。用户在不同页面浏览和操作时,购物车的内容可以通过 Cookie 保持一致。
类型
- 会话 Cookie:也称为临时 Cookie,它不会被存储在硬盘上,而是存储在浏览器的内存中。当用户关闭浏览器时,会话 Cookie 会被自动删除。
- 持久 Cookie:会被存储在用户的硬盘上,直到达到指定的过期时间或用户手动删除。持久 Cookie 可以在浏览器关闭后仍然存在,下次打开浏览器访问网站时,仍然可以使用该 Cookie。
安全风险
- 信息泄露:如果 Cookie 中包含敏感信息,如用户密码、信用卡号等,一旦 Cookie 被窃取,这些信息可能会被泄露。
- 会话劫持:攻击者可以通过窃取用户的 Cookie 来冒充用户身份,进行非法操作,如登录用户账户、进行交易等。
- 跨站脚本攻击(XSS):攻击者可以通过注入恶意脚本,获取用户的 Cookie 信息,从而进行会话劫持等攻击。为了应对这些安全风险,可以采取一些措施,如使用
HttpOnly
和Secure
属性来增强 Cookie 的安全性。
session
定义与作用
Session 是指在一段时间内,用户与应用程序或系统之间的一系列交互过程。它允许应用程序在多个请求之间记住用户的相关信息,例如用户登录状态、浏览历史、购物车内容等,从而为用户提供连续、个性化的体验。
工作原理
当用户首次访问应用程序时,服务器会为该用户创建一个唯一的 Session 标识符(通常是一个字符串),并将其发送给客户端。客户端通常会将这个标识符存储在 Cookie 中,或者通过 URL 参数等方式在后续的请求中发送回服务器。服务器根据接收到的 Session 标识符来查找对应的 Session 对象,获取用户的相关信息,并在处理请求时更新 Session 中的数据。
在不同领域的应用
Web 开发:在 Web 应用中,Session 常用于实现用户登录功能。用户登录后,服务器将用户的登录信息存储在 Session 中,后续用户访问其他页面时,服务器可以通过 Session 验证用户的身份,判断其是否有权限访问相应的资源。此外,Session 还可用于存储用户在购物车中的商品信息、页面浏览历史等。
网络编程:在一些网络应用程序中,Session 可以用于管理客户端与服务器之间的连接状态。例如,在即时通讯应用中,Session 可以记录用户的在线状态、聊天记录等信息,确保用户在不同设备上登录时能够保持一致的状态。
cookie和session之间的关联、区别与特点
关联
传递 Session ID
- 当用户访问 Web 应用时,服务器创建 Session 并生成唯一的 Session ID。服务器将 Session ID 通过 Cookie 发送到客户端浏览器。例如,用户登录网站,服务器为该用户创建 Session,同时在响应头中设置一个包含 Session ID 的 Cookie,浏览器接收并存储此 Cookie。
后续请求中的识别
- 客户端在后续请求中会自动携带包含 Session ID 的 Cookie。服务器收到请求后,从 Cookie 中提取 Session ID,然后根据该 Session ID 在服务器端查找对应的 Session 对象,从而获取用户的相关状态信息。比如,用户在多个页面间切换浏览商品时,每次请求都带着 Session ID 的 Cookie,服务器依据此 Cookie 中的 Session ID 找到用户的 Session,得知用户购物车中的商品等信息。
配合实现状态管理
- Session 负责在服务器端存储用户的状态数据,而 Cookie 负责在客户端和服务器之间传递 Session ID,两者相互配合,使得 Web 应用能够在多个请求之间跟踪用户的会话状态。即使客户端关闭浏览器后重新打开,只要 Cookie 未过期,再次访问网站时,仍可通过 Cookie 中的 Session ID 找到之前的 Session,恢复用户的部分状态信息,如未完成的订单信息等。
区别
存储位置
- Cookie:数据存于客户端(浏览器),以文本文件的形式保存在用户的计算机硬盘(持久化 Cookie)或内存(会话 Cookie)中。
- Session:数据存于服务器端,服务器会为每个用户的会话创建一个独立的 Session 对象,用来存储该用户的相关状态信息。
安全性
- Cookie:安全性相对较低,因为存储在客户端,容易被窃取、篡改或伪造。如果 Cookie 中包含敏感信息,如用户密码、信用卡号等,一旦泄露,可能会造成严重的安全问题。
- Session:安全性较高,敏感信息存于服务器端,客户端仅持有 Session ID。即使攻击者获取了 Session ID,没有服务器端的相应数据和验证机制,也难以获取到敏感信息。
数据大小限制
- Cookie:有大小限制,不同浏览器的限制有所不同,但通常每个 Cookie 的大小不能超过 4KB。
- Session:服务器端存储数据,一般不受大小限制,但考虑到服务器性能和资源,也不宜存储过多过大的数据。
有效期
- Cookie:分为会话 Cookie 和持久化 Cookie。会话 Cookie 在浏览器关闭时自动删除;持久化 Cookie 有指定的过期时间,在过期前一直有效。
- Session:有超时机制,若用户在一定时间内无操作,服务器会自动销毁 Session。也可通过编程方式手动销毁。
特点
Cookie 的特点
- 简单易用:无需服务器端复杂的管理,浏览器自动处理 Cookie 的存储和发送。
- 跨页面使用:同一域名下的不同页面可以共享 Cookie 数据,方便在不同页面间传递信息。
- 兼容性好:所有主流浏览器都支持 Cookie,能在各种客户端设备上使用。
Session 的特点
- 安全性强:数据存储在服务器端,能有效保护敏感信息。
- 数据管理灵活:可以存储各种类型的数据,包括对象、数组等,便于服务器端根据业务需求进行复杂的数据管理和操作。
- 可控制生命周期:服务器能根据业务逻辑精确控制 Session 的创建、销毁和有效期。
token
Token 是一种令牌或标记,在计算机领域尤其是在身份验证和授权机制中有着广泛的应用。以下是关于它的详细介绍:
概念
Token 是一个由服务器生成并颁发给客户端的字符串,用于证明客户端的身份或授权其访问特定的资源。它就像是一把钥匙,客户端持有这把钥匙就可以在一定条件下访问服务器上的受保护资源,而无需在每次请求时都重新输入用户名和密码等敏感信息。
工作原理
- 生成与颁发:当用户成功登录系统时,服务器会根据用户的身份信息和一些加密算法生成一个唯一的 Token,并将其返回给客户端。这个过程中,服务器会对用户的身份进行验证,确保只有合法的用户才能获得 Token。
- 携带与验证:客户端在后续的请求中会将 Token 包含在请求头或其他指定的位置发送给服务器。服务器接收到请求后,会对 Token 进行验证,通过解析 Token 中的信息来确认客户端的身份和权限。如果 Token 有效且权限匹配,服务器就会处理客户端的请求并返回相应的资源;如果 Token 无效或已过期,服务器则会拒绝请求,并要求客户端重新进行身份验证。
作用
- 身份验证:Token 最主要的作用是用于身份验证。它允许客户端在一段时间内无需再次输入用户名和密码等凭证即可访问受保护的资源,提高了用户体验和系统的安全性。例如,在一个移动应用中,用户登录后获取到 Token,之后在应用内的各种操作,如查看个人信息、发布动态等,都可以通过携带 Token 来证明用户的身份,而无需每次都重新登录。
- 授权管理:Token 可以携带用户的权限信息,服务器根据这些信息来判断用户是否有权访问特定的资源或执行特定的操作。例如,一个系统中有不同角色的用户,如管理员、普通用户等,通过 Token 中的权限标识,服务器可以限制普通用户只能访问自己的个人信息,而管理员则可以进行系统设置、管理其他用户等操作。
- 单点登录(SSO):在多个相关系统集成的场景中,Token 可以用于实现单点登录。用户在一个系统中登录成功后,获取到的 Token 可以在其他相互信任的系统中进行身份验证和授权,使得用户无需在每个系统中分别登录,提高了系统的集成性和用户的使用便利性。
常见类型
- JSON Web Token(JWT):这是一种非常流行的 Token 格式,由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。头部包含了 Token 的类型和加密算法等信息,载荷中存储了用户的身份信息、权限信息以及其他一些自定义的数据,签名则用于验证 Token 的完整性和真实性。JWT 通常用于 Web 应用和移动应用的身份验证和授权,具有简洁、自包含、易于传输等优点。
- OAuth Token:主要用于授权第三方应用访问用户在另一个系统中的资源。例如,当用户使用微信账号登录某个第三方应用时,第三方应用会向微信服务器请求一个 OAuth Token,通过这个 Token 来获取用户在微信中的部分信息,如头像、昵称等,但不会获取用户的微信账号密码等敏感信息,从而实现了安全的授权访问。
token的特点,跟cookie、session的区别、关联
特点
- 无状态性:Token 自身包含了所有用于验证和授权的信息,服务器无需在内存中存储额外的用户状态信息。这使得服务器可以更容易地进行扩展,处理大量并发请求。
- 安全性较高:通常使用加密算法进行签名和验证,防止 Token 被篡改或伪造。同时,Token 可以设置较短的有效期,降低了被窃取后长时间有效的风险。
- 跨平台性:可以在不同的平台和设备上使用,只要客户端能够正确处理和携带 Token。
与 Cookie、Session 的区别
- 存储位置:Cookie 存储在客户端浏览器中,Session 存储在服务器端,而 Token 可以存储在客户端(如本地存储、内存等),也可以在请求中传递,不依赖于特定的存储位置。
- 状态管理:Session 是服务器端有状态的,服务器通过 Session ID 来跟踪用户的会话状态。而 Token 是无状态的,服务器不依赖于内存中的状态来验证请求,只需要验证 Token 的有效性。Cookie 主要用于在客户端和服务器之间传递少量的信息,它本身不直接用于状态管理,但可以用于存储 Session ID 等信息来间接实现状态管理。
- 数据传输:Cookie 会在每次请求和响应中自动在客户端和服务器之间传输,可能会携带一些不必要的信息。Session 数据存储在服务器端,客户端通过 Session ID 来访问,而 Token 通常由客户端在请求时手动添加到请求头或其他位置进行传输,更加灵活和可控。
与 Cookie、Session 的关联
- 与 Cookie 的关联:在某些情况下,Token 可以通过 Cookie 来传递,例如在 Web 应用中,服务器可以将 Token 设置为一个 HttpOnly 的 Cookie,以防止客户端脚本访问,提高安全性。同时,Cookie 也可以存储其他与 Token 相关的信息,如 Token 的过期时间等。
- 与 Session 的关联:Token 可以作为一种替代 Session 的身份验证和授权方式。在传统的 Session 机制中,服务器通过 Session ID 来识别用户的会话,而使用 Token 时,服务器通过验证 Token 来确定用户的身份和权限,无需依赖 Session 对象。不过,在一些系统中,也可以将 Token 与 Session 结合使用,例如在生成 Token 时,可以将一些与 Session 相关的信息存储在 Token 中,或者在服务器端根据 Token 来查找对应的 Session 信息。