一文搞懂Cookie、Session、Token的区别

David Ng | 2026-09-02T03:24:00 | Frontend, Security

Cookie、Session、Token到底有什么区别?有状态和无状态认证的优缺点对比

# 一文搞懂Cookie、Session、Token的区别 面试必问题:"说说Cookie、Session和Token的区别"。今天用大白话讲清楚。 ## Cookie 浏览器存储的小文本,每次请求自动携带。 ``` // 服务端设置Cookie Set-Cookie: user_id=123; Path=/; HttpOnly; Secure; SameSite=Strict ``` 问题:容易被CSRF攻击,跨域受限。 ## Session 服务端存储用户状态,Cookie里只存一个SessionID。 ```java // 服务端创建Session HttpSession session = request.getSession(); session.setAttribute("user", userInfo); // Cookie里存的是:JSESSIONID=abc123 // 下次请求自动带上JSESSIONID,服务端根据ID找到Session UserInfo user = (UserInfo) session.getAttribute("user"); ``` 问题:**有状态**。服务端要存Session,集群部署需要Session共享(Redis),消耗内存。 ## Token (JWT) ```json // JWT结构:Header.Payload.Signature { "header": {"alg": "HS256", "typ": "JWT"}, "payload": {"userId": 123, "exp": 1700000000}, "signature": "HMAC-SHA256(header.payload, secret)" } ``` ```java // 服务端验证Token,不需要存储任何状态 String token = request.getHeader("Authorization").replace("Bearer ", ""); Claims claims = Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .getBody(); Long userId = claims.get("userId", Long.class); ``` 优点:**无状态**,服务端不存东西,天然支持分布式。 | 特性 | Cookie+Session | Token(JWT) | |------|---------------|------------| | 状态 | 有状态 | 无状态 | | 存储 | 服务端 | 客户端 | | 跨域 | 困难 | 简单 | | 扩展 | 需Session共享 | 天然分布式 | 面试说到这个程度加上自己的理解,基本就够了。

← Back to Blog