cookie,session,token,jwt,oauth2 有什么区别

一、概念及本质

概念 本质 存储位置 主要用途 特点
Cookie HTTP状态管理机制 浏览器端 维持会话状态 自动携带,有大小限制
Session 服务端会话信息 服务器端 存储用户状态 服务端维护,需要管理存储
Token 访问凭证 客户端/服务端 身份认证 自包含,可验证,无需服务器存储状态
JWT Token标准化实现 客户端/服务端 安全传输信息 标准化、自包含、可签名
OAuth2 授权框架 不直接存储 第三方授权 标准化授权流程,定义角色和访问令牌

二、工作原理和实现

1. Cookie

  • 作用:浏览器自动带上标识,维持会话状态

  • 示例代码

// 设置Cookie  
Cookie cookie = new Cookie("session_id", generateSessionId());  
cookie.setMaxAge(3600);  
cookie.setHttpOnly(true);  
cookie.setSecure(true);  
response.addCookie(cookie);  

// 读取Cookie  
@CookieValue("session_id") String sessionId
  • 重要属性

    • HttpOnly:防 XSS

    • Secure:仅 HTTPS 传输

    • SameSite:防 CSRF

    • Max-Age:有效期

2. Session

  • 作用:服务端存储用户状态,浏览器通过 Cookie 携带 session ID

  • 存储方案

    1. 内存存储(默认)

    2. Redis 分布式存储(适合集群)

  • 示例代码

// Spring Session  
session.setAttribute("currentUser", user);  
User user = (User) session.getAttribute("currentUser");
  • 特点

    • 服务器状态维护

    • 需要同步管理

    • 适合传统 Web 应用

3. Token

  • 作用:自包含身份凭证,服务器无需存储会话

  • 示例代码(JWT):

String token = JWT.create()  
        .withIssuer("myapp")  
        .withSubject(user.getId())  
        .withClaim("username", user.getUsername())  
        .sign(Algorithm.HMAC256(secret));
  • 特点

    • 无状态(stateless)

    • 可放在 Header、Cookie 或 URL

    • 适合前后端分离、移动端

4. JWT(JSON Web Token)

  • 结构header.payload.signature

  • 示例

// Header  
{"alg":"HS256","typ":"JWT"}  
// Payload  
{"sub":"123","name":"John Doe","iat":1516239022,"exp":1516242622}  
// Signature  
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload), secret)
  • 最佳实践

    • 安全存储:HttpOnly Cookie 或内存

    • 双Token机制:Access Token(短期) + Refresh Token(长期)

5. OAuth2

  • 作用:第三方授权框架

  • 角色

    • Resource Owner(用户)

    • Client(第三方应用)

    • Authorization Server(颁发令牌)

    • Resource Server(托管资源)

  • 授权流程:常用授权码模式(Authorization Code)

  • 示例(Spring Security OAuth2):

// 授权服务器配置  
clients.inMemory()  
       .withClient("clientapp")  
       .secret(passwordEncoder.encode("123456"))  
       .authorizedGrantTypes("authorization_code","refresh_token")  
       .scopes("read","write")  
       .redirectUris("http://localhost:8080/callback");

三、应用场景对比

场景 推荐方案 说明
传统 Web 应用 Session + Cookie 简单易用,生态成熟
前后端分离 JWT 无状态 API 认证,跨域友好
第三方登录 OAuth2 标准化授权流程,安全可靠
微服务架构 JWT 分布式认证,无需会话同步
移动端 Token 轻量、适合移动网络

四、安全考虑

威胁 Cookie方案防护 Token/JWT防护
XSS HttpOnly 避免 localStorage 存储
CSRF SameSite Cookie 自定义 Header + CSRF Token
令牌泄露 短期有效 + HTTPS 短期有效 + HTTPS + 刷新机制
数据篡改 服务端验证 签名验证

五、总结

  1. Cookie:HTTP 状态管理载体

  2. Session:服务端状态信息

  3. Token:自包含身份凭证

  4. JWT:Token 标准化实现

  5. OAuth2:授权框架

选择原则

  • 简单 Web 应用 → Session + Cookie

  • 前后端分离 → JWT + HTTP Header

  • 第三方授权 → OAuth2 + JWT

没有绝对的最佳方案,只有最适合的方案。理解本质和适用场景才能做出正确架构决策。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容