赞
踩
目录
JSON Web Token(JWT)是一个开发标准(RFC 7519),它定义了一种紧凑独立的基于 JSON 对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任,因为它是数字签名的。JWTs 可以使用一个密钥(HMAC算法),或使用 RSA 的公钥/私钥密钥对对信息进行签名。
由于其较小的体积,JWTs 可以通过 URL、POST 参数或 HTTP 头部参数进行传递,体积小也意味着其传输速度会相当快。
独立
有效负载包含了所需要的关于用户的所有信息,避免了多次查询数据库的需要。
用户一旦登录,之后的每一个请求都会带上这个 JWT ,用来访问该 token 权限下的路由,服务和资源。由于 JWT 的开销小,能解决跨域问题等特点,被广泛的应用于 SSO。
JSON Web 能给在客户端和服务端之间安全地传输信息。 通过使用非对称加密签名技术,可以对客户端进行签名验签。此外,可以使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。
1、客户端向服务端发送用户名和密码进行登录操作。
2、服务端验证通过后,保存当前对话(session)的相关数据,比如用户角色、登录时间等等。
3、服务端返回一个 session_id 给客户端,客户端将得到的这个 id 写入 Cookie。
4、客户端之后的每一次请求,都会通过 Cookie,将 session_id 传回服务端。
5、服务端收到 session_id,找到前期保存的数据,由此得知客户端的身份。
缺点:扩展性(scaling)不好,单机容易实现,如果是集群或者是跨域的服务架构,需要 session 数据共享。一旦 session 持久层宕机,会出现单点失败问题。
1. 客户端使用用户名密码来请求服务端
2. 服务端进行验证用户的信息
3. 服务端通过验证下发给客户端一个 token
4. 客户端将 token 存储在 cookie 中,并在每次请求时附送上这个 token 值
5. 服务端验证 token 值,并返回数据
基于 token 的鉴权机制类似于 http 协议也是无状态的,它不需要在服务端持久化会话信息,需要持久化 token 信息 ,且只有在用户的密码发生变更的时候 token 才会发生变化,安全性无法得到保证。
JWT 由以下三部分,每部分之间用(.)分隔:
a. Header(头部)
b. Payload(载荷)
c. Signature(签名)
因此,JWT 通常看起来如下:
xxxxx.yyyyy.zzzzz
JWT 的头部承载两部分信息:
a. 声明类型,这里是 JWT
b. 声明加密的算法 通常直接使用 HMAC SHA256、RSA
比如:
- {
- 'typ': 'JWT',
- 'alg': 'SHA256'
- }
该 JSON 经过 Base64Url 加密(该加密是可以对称解密的),构成 JWT 的第一部分。
JWT 的第二部分,由声明构成。声明是对实体和其他信息的描述,声明可以分成三大类,
a. 标准中注册的声明
b. 公共的声明
c. 私有的声明
4.2.1 标准中注册的声明 (建议但不强制使用) :
a. iss(Issuer): JWT 签发者
b. sub(Subject): JWT 所面向的用户
c. aud(Audience): 接收 JWT 的一方
d. exp(Expiration Time): JWT 的过期时间,这个过期时间必须要大于签发时间
e. nbf(Not Before): 定义在什么时间之前,该 JWT 都是不可用的
f. iat(Issued At): JWT 的签发时间
g. jti(JWT ID): JWT 的唯一身份标识,主要用来作为一次性 token,从而回避重放攻击
4.2.2 公共的声明:
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密。
4.2.3 私有的声明:
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 Base64Url 是对称解密的,意味着该部分信息可以归类为明文信息。
例如:
- {
- "sub": "1234567890",
- "name": "John Doe",
- "admin": true
- }
该 JSON 经过 Base64Url 加密,构成 JWT 的第二部分。
签名用于验证 JWT 的发送者是谁,并确保消息在过程中不会被篡改。创建签名部分,你需要用到编码后的 header、编码后的 payload、密钥、在 header 中指定的算法。
如下使用 HMAC SHA256 算法创建签名的方式:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
讲完了上面3个部门,最后就是由这3部分组成了。每个部分经过 Base64Url 编码后,以.分隔。它能很容易的在HTML和HTTP环境中传递,也比像类似xml标准格式这样的更紧凑。
如果想使用JWT并将这些概念应用到实践中,您可以使用官网首页下面的调试器来解码、验证和生成JWTs。JSON Web Tokens - jwt.io
客户端收到服务端返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 Bearer 模式下的 HTTP 请求的头信息 Authorization 字段里面。Authorization: Bearer <token> 。另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
a. 因为 JSON 数据格式的通用性,所以JWT是可以跨语言的,主流语言都可以支持。
b. payload 部分可以存储其他业务逻辑所必要的非敏感信息。
c. JWT 构成简单,字节占用很小,所以非常便于传输的。
d. 不需要在服务端保存会话信息,易于应用的扩展和安全等。
a. 不要在 payload 存放敏感信息,因为该部分是可解密的。
b. 保存好 secret 私钥十分重要。
c. 尽量使用 https 协议
a. JWT 的最大缺点是,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
b. JWT 续约问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。