身份认证: JWT和Session是什么?
一、为什么需要临时凭证?
系统面临三个核心约束:
-
唯一鉴权方式只有(账号,密码)
-
服务端不记录请求状态,服务端不知道用户已登录了
-
避免重复传输敏感信息,不能每次都携带(账号,密码)进行请求
解决方案:登录时下发有时效的「通行证」
二、JWT的核心原理
如果通行证是一个简单的字符串info,会发生什么问题?
答: info可以被篡改和伪造,服务端无法进行身份认证
解决方案: 将info用私钥加密为Signature,将(info,Signature)捆绑下发
如果篡改或伪造,需要同时修改info和Signature两部分,而没有私钥无法正确生成Signature
JWT的三部分为:
-
Header(头部):描述令牌类型和签名算法
-
Payload(负载):存放实际数据(如用户ID、过期时间等)
-
Signature(签名):对前两部分的加密
格式:Header.Payload.Signature
(Base64URL编码拼接)
三、Session的核心原理
服务端生成一个全局随机SessionID,并在服务器上存储(SessionID,用户信息)表示用户已登录
然后将SessionID下发到客户端, 后续请求时只需要携带SessionID
四、安全性问题
为什么不能每次发送密码?
风险维度 | 密码直传 | 临时凭证 |
---|---|---|
通信安全 | 必须全程HTTPS | 只需保护初始登录 |
泄露影响 | 相当于永久权限 | 有时效性 |
客户端存储 | 密码明文存储风险极高 | 仅存储无意义字符串 |
并不是说使用JWT、Session就绝对安全了,只是凭证具有时效性,危害较小