JWT
JWT (JSON Web Token)也是一种 Token,可以基于 JWT 来做权限认证。
由 Header、Payload 以及 Signature 三部分组成构成。
- 其中 Header 是描述 JWT 的元数据,包括 token 的类型和生成签名的算法。
- Payload:负载,存的是需要传递的数据;比如登录的时候需要存储用户的登录信息。
- Signature:签名,通过 Header 里指定的签名算法,对 Header 和 Payload 配合密钥生成。主要是防止 Token 被篡改。
基于 JWT 进行身份验证原理(过程)
客户端发起登录请求(提交登录信息,比如用户名和密码),假设验证成功,服务端会根据 Header 和 Payload 以及 Secret 密钥生成一个 token
,并发送给客户端,客户端收到后存储在 Cookies
或 LocalStorage
中,以后客户端每次请求都会在 Header 中携带这个令牌用作登录验证。
tips:LocalStorage 是浏览器中永久存在的,只有主动删除时才会被删除,而 sessionStorage 是会话结束后自动删除。
服务端收到请求后,会对令牌进行验证,验证通过才能放行。
如何防止 Token 被篡改
因为服务端收到 Header 和 Payload 后,会再生成一个签名 Signature ,用这个 signature 和 Token 中携带的 signature 进行对比,如果不一致说明被篡改了。
因此密钥要保护好,否则攻击者可以通过该密钥,对 Header 和 Payload 生成一个新的签名,再给服务端就检测不到错误了。
与 Session 相比有什么优缺点
对服务端空间友好,不需要存额外的数据,而 session 需要存在 Redis 或者 Mysql 里。
安全性更高,不需要通过 Cookies 进行验证(Cookies 很容易被作为伪造身份的信息),如上述中有一层认证更安全。