JWT 相关知识
1. JSON Web Token是什么
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
简单的讲,JWT 是用于网络间传递声明而执行一种基于 JSON 的标准
2. 为什么使用 JWT?
(1) 跨域认证,单点登录
(2) API开发,前后端分离, 需要简单的对后台API进行保护
(3) 安全的信息交换(数字签名)
3. JWT的结构
JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:
Header Payload Signature
因此,一个典型的JWT看起来是这个样子的:
xxxxx.yyyyy.zzzzz (各个部分均用 Base64URL转码,没有加密,不能放保密数据)
示例:
4. JWT的使用方式
(1) 放在 HTTP 请求的头信息 Authorization字段 里面:
Authorization: Bearer
(2) 放在 POST 请求的数据体里面
(3) 为了安全,JWT 应该使用 HTTPS 传输
5. JWT的优点
(1) 无状态和可扩展性
(2) 安全:Token不是Cookie,每次请求的时候Token都会被发送。而且,由于没有Cookie被发送,还有助于防止CSRF攻击
6. JWT与session的区别
相同点:存储用户信息
不同点:
Session是在服务器端的;JWT是在客户端的,服务端是无状态的
Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销; JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。
Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。
7. JWT与OAuth的区别
(1) OAuth2是一种授权框架 ,JWT是一种认证协议
(2) OAuth2用在使用第三方账号登录的情况,而JWT是在用户身份鉴别时使用。
8. Bearer 方案
Bearer 验证也属于HTTP协议标准验证,它随着OAuth协议而开始流行,详细定义见: RFC 6570。
Bearer 验证中的凭证称为 BEARER_TOKEN,或者是access_token,它的颁发和验证完全由我们自己的应用程序来控制,不依赖于系统和Web服务器
OAuth2 或 API 认证,一般使用 JWT 作为客户端的认证手段,而JWT 传递 Token是用 Bearer Token方案:
即认证体前面加上 Bearer:
Authorization: Bearer[Token]
8. JWT的适用场景
(1) 一次性验证
比如用户注册后需要发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:
能够标识用户
该链接具有时效性(通常只允许几小时之内激活)
不能被篡改以激活其他可能的账户
这种场景就和 jwt 的特性非常贴近,jwt 的 payload 中固定的参数:iss 签发者和 exp 过期时间正是为其做准备的
(2) RESTful API 的无状态认证
客户端和服务端共享 secret;过期时间由服务端校验,客户端定时刷新;签名信息不可被修改
restful api 的无状态认证也可以由 Oauth2 完成
不太适合的场景:单点登录+会话管理
不推荐使用 jwt+cookie 代替 session+cookie
在 web 应用中,使用 jwt 代替 session 存在不小的风险,至少得解决一些问题(如:jwt token泄露,secret如何设计,注销和修改密码,续签问题等),绝大多数情况下,传统的 cookie-session 机制工作得更好。jwt 适合做简单的 restful api 认证,颁发一个固定有效期的 jwt,降低 jwt 暴露的风险,不要对 jwt 做服务端的状态管理,这样才能体现出 jwt 无状态的优势。