CSRF下的思考Cookie、Session、Token和JWT

之前基于cookie、session有了大致了解,但是看完csrf之后感觉很乱,有了不少问题,于是做一个小总结,关于各种概念大家可以先去查一查其他的博文,该篇博文主要是针对个人一些疑问做记录

CSRF 跨站伪造请求

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

一般流程如下:

在这里插入图片描述

该攻击特点:

①攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
②攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
③整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
④跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
⑤CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。

针对其攻击特点也是有一些列防护措施的,之后会讲~

Cookie和Session

HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),

### Cookie Cookie 是由服务器发送给客户端的一小段数据,客户端会将其保存,并在后续请求中携带回服务器。它通常用于记录用户状态、偏好设置等信息。Cookie 可以设置过期时间,根据是否设置过期时间分为会话 Cookie 持久 Cookie。会话 Cookie 在浏览器关闭时自动清除,而持久 Cookie 则会在指定的时间后过期[^1]。 ### Session Session 是服务器端用来跟踪用户状态的一种机制。当用户登录后,服务器会创建一个唯一的 Session ID,并将该 ID 通过 Cookie 或 URL 重写等方式返回给客户端。客户端在后续请求中携带这个 Session ID,服务器通过查找存储的 Session 数据来识别用户状态。Session 的生命周期通常由服务器控制,可以灵活地设置过期时间或手动销毁[^1]。 ### Token Token 是一种无状态的身份验证机制。用户登录后,服务器生成一个 Token 并返回给客户端。客户端在后续请求中携带该 Token,服务器通过解析 Token 来验证用户身份。 Session 不同的是,Token 本身可能包含用户信息(如用户名、权限等),服务器无需查询数据库即可完成验证。Token 的生命周期由签发时设定的有效期决定,且一旦签发,在有效期内无法被撤销[^2]。 ### JWT (JSON Web Token) JWTToken 的一种具体实现,采用 JSON 格式定义声明(claims),并通过签名确保数据的完整性。JWT 由三部分组成:头部(Header)、载荷(Payload)签名(Signature)。其中,Payload 包含了用户信息(如用户 ID、角色等),签名则用于验证 JWT 的真实性。JWT 是无状态的,服务器不需要存储任何 Session 数据,只需使用密钥解密 JWT 即可验证其有效性。这种方式使得 JWT 非常适合分布式系统中的身份验证需求[^4]。 ### 区别适用场景 - **状态管理方式** Cookie 是客户端存储的小型数据,Session 是服务器端的状态管理机制,Token JWT 则是无状态的身份验证机制。Session 需要服务器维护状态,而 Token JWT 不需要。 - **安全性** Cookie 可以通过设置 `HttpOnly` `Secure` 属性提高安全性,防止 XSS 攻击。Session 依赖于 Cookie 存储 Session ID,因此也面临类似的安全风险。Token JWT 由于是无状态的,更容易防范 CSRF 攻击,但需要注意 Token 的保护,避免泄露[^2]。 - **扩展性** Session 在分布式系统中需要额外的机制(如 Redis)来共享状态,增加了复杂度。Token JWT 更容易扩展,尤其是 JWT,因为服务器不需要存储任何状态信息,只需验证签名即可[^3]。 - **生命周期控制** Session 可以通过编程方式随时销毁,而 Token JWT 一旦签发,在有效期内无法被撤销。如果需要提前失效 TokenJWT,必须引入黑名单机制或其他额外逻辑[^3]。 - **性能影响** Session 每次请求都需要查询数据库或缓存获取用户信息,增加了 I/O 开销。Token JWT 尤其是 JWT,由于自包含用户信息,减少了数据库查询次数,提升了性能[^4]。 ### 示例代码 以下是一个简单的 JWT 签发验证的 Python 示例: ```python import jwt from datetime import datetime, timedelta # 密钥 SECRET_KEY = 'your-secret-key' # 签发 JWT def generate_jwt(user_id): payload = { 'user_id': user_id, 'exp': datetime.utcnow() + timedelta(hours=1) # 设置过期时间为1小时后 } token = jwt.encode(payload, SECRET_KEY, algorithm='HS256') return token # 验证 JWT def verify_jwt(token): try: payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256']) return payload['user_id'] except jwt.ExpiredSignatureError: return 'Token 已过期' except jwt.InvalidTokenError: return '无效的 Token' # 使用示例 token = generate_jwt(123) print("Generated JWT:", token) user_id = verify_jwt(token) print("Verified User ID:", user_id) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值