理解:JWT

什么是 JWT -- JSON WEB TOKEN

json web token是用来做什么的?

--------------------------------------------------------------------------

一、JWT 介绍


JSON web Token,简称JWT,本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。
一般放在HTTP的headers 参数里面的authorization里面,值的前面加Bearer关键字和空格。除此之外,也可以在url和request body中传递。(传递方式跟session一样)



引用

与 session 的比较:
session
用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。


引用

JWT
JWT 是 session 的复杂实现(本来保存在 session 中的(非敏感)数据,保存到 JWT 中了)。
Session 只会传递一个 sessionid,
而 JWT 可以传递所有可能的信息,写在body里。

它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。(本来保存在内存中的数据,统统写到 JWT 中,用以跨域传递)。

这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *


JWT是基于 cookie/session 认证的替代品。



二、JWT 是如何加密,解密的?

JWT由三部分组成。依顺序用点号(".")链接而成:1.header,2.payload,3.signature。

例如: aaaa.bbbbbb.cccc

header里面说明类型和使用的算法 (明文加密)

{
  "alg": "HS256",   // 加密算法
  "typ": "JWT"        // token类型
}

payload是一组claim的值 (用来存放真正有效数据的地方)(明文加密)

signature 就是用点号将header和payload联系起来后,加上秘钥,
然后用header里面指定的加密方法进行加密后的字符串。

signature 生成方程式:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

其中,只有服务器端才有 secret,这样就能保证只有服务器端才会生成相同的签名。
这样就起到了验证的作用。

注意:
secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。






三、OAuth2.0 与 JWT 的关系

OAuth2.0 是一种授权通信的协议(是凡协议,都有一定的流程和步骤:OAuth2.0 认证的流程),

OAuth2.0 在其认证流程中使用的 token ,就是 JWT 格式的。


授权和获取的流程如下:
引用


授权部分
1、
首先,服务器应用(下面简称“应用”)让用户通过Web表单将自己的用户名和密码发送到服务器的接口。
这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。

2、
接下来,应用和数据库核对用户名和密码。
核对用户名和密码成功后,进行 OAuth2.0 过程验证。
最后应用将用户的id(图中的user_id)作为JWT Payload的一个属性,
将其与头部分别进行Base64编码拼接后签名,形成一个JWT。这里的JWT就是一个形同lll.zzz.xxx的字符串。

获取部分
3、
应用将JWT字符串作为该请求Cookie的一部分返回给用户。
注意,在这里必须使用HttpOnly属性来防止Cookie被JavaScript读取,从而避免跨站脚本攻击(XSS攻击)。

在Cookie失效或者被删除前,用户每次访问应用,应用都会接受到含有jwt的Cookie。
从而应用就可以将JWT从请求中提取出来。

4、
应用通过一系列任务检查JWT的有效性。
例如,检查签名是否正确;检查Token是否过期;检查Token的接收方是否是自己(可选)。

应用在确认JWT有效之后,JWT进行Base64解码(可能在上一步中已经完成),
然后在Payload中读取用户的id值,也就是user_id属性。这里用户的id为1025。

应用从数据库取到id为1025的用户的信息,加载到内存中,进行ORM之类的一系列底层逻辑初始化。














-

猜你喜欢

转载自lixh1986.iteye.com/blog/2407261
jwt