Token 的作用
Token 在现代软件开发和网络安全中扮演着关键角色,尤其在身份验证、授权和数据安全方面。以下是 Token 的主要作用:
身份验证与授权
Token 常用于验证用户身份并授予访问权限。用户在登录后,服务器生成一个 Token 并返回给客户端。客户端在后续请求中携带该 Token,服务器通过验证 Token 确认用户身份并决定是否允许访问资源。
无状态性
Token 使服务端无需保存会话状态,适合分布式系统和微服务架构。服务端仅需验证 Token 的签名和有效期,无需维护会话信息,降低服务器负担。
安全性
Token 通常使用加密算法(如 JWT)签名,防止篡改。Token 可以设置有效期,减少长期暴露的风险。敏感信息可避免直接存储在 Token 中,仅保留必要的数据。
跨域支持
Token 适用于跨域场景,如单页应用(SPA)或移动端与 API 的交互。通过 HTTP 头部(如 Authorization: Bearer <token>)传递,避免跨域限制。
权限控制
Token 可包含用户角色或权限信息,服务端根据这些信息决定是否允许执行特定操作。例如,管理员 Token 可能包含更高权限的声明。
Token 的常见类型
JWT(JSON Web Token)
结构化 Token,包含头部、载荷和签名。载荷可存储用户 ID、角色等信息,适合无状态认证。
OAuth Token
用于第三方授权,分为访问令牌(Access Token)和刷新令牌(Refresh Token)。访问令牌短期有效,刷新令牌用于获取新的访问令牌。
Session Token
传统会话标识符,通常存储在 Cookie 中。服务端需维护会话状态,与无状态 Token 形成对比。
HTTP 请求中的 Token
客户端在请求头中携带 Token:
GET /api/data HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
JWT 结构示例
一个典型的 JWT 包含三部分:
- 头部:声明算法和类型,如
{"alg": "HS256", "typ": "JWT"} - 载荷:存储数据,如
{"sub": "123", "name": "Alice", "exp": 1735689600} - 签名:使用密钥对头部和载荷签名,确保完整性。
通过合理设计 Token 的生成、传递和验证机制,可以有效提升系统的安全性和扩展性。
Token与Cookie
Token和Cookie均用于身份验证和会话管理,但设计目标和实现方式不同。
Cookie
- 由服务器生成并发送到客户端(浏览器),存储在客户端本地。
- 每次请求时,浏览器自动附上Cookie,无需手动处理。
- 通常包含会话ID、用户偏好等非敏感数据。
- 依赖HTTP协议,存在跨域限制(需配置CORS或SameSite属性)。
Token(如JWT)
- 服务器生成后返回客户端,由客户端(如前端代码)主动存储和管理(如localStorage)。
- 需手动在请求头(如
Authorization: Bearer <token>)中附加Token。 - 包含签名信息,可自包含用户数据(如JWT的Payload),减少数据库查询。
- 无状态化,适用于分布式系统,但对过期机制需额外处理(如Refresh Token)。
关键对比
| 特性 | Cookie | Token(如JWT) |
|---|---|---|
| 存储位置 | 浏览器自动管理 | 需开发者手动存储/发送 |
| 安全性 | 易受CSRF攻击 | 需防范XSS攻击 |
| 跨域支持 | 需配置SameSite/CORS | 无限制 |
| 状态管理 | 服务器需维护会话状态 | 无状态 |
适用场景
- Cookie:传统Web应用,需浏览器自动管理会话(如电商网站购物车)。
- Token:前后端分离、API服务、移动端应用(如OAuth2.0授权)。
安全注意事项
- Cookie需设置
HttpOnly和Secure防止XSS和中间人攻击。 - Token应避免存储在Cookie中,防止CSRF;过期时间需缩短以提高安全性。

被折叠的 条评论
为什么被折叠?



