JWT 全称 Json web token,是一种开发的行业标准,它用于安全的表示双方间的声明,目前jwt主要用于系统的用户认证,特别是前后端分享项目。
它的过程如下:
在项目开发中,一般上按照上图所示的过程进行认证,即:用户登陆成功之后,注意,第一次请求时是没有token,只验证账号密码,验证成功后,服务端给用户浏览器返回一个token,以后用户浏览器要携带token再向服务器发送请求时,服务端校验token合法性,以及超时时间,合法则返回数据,否则返回一些状态信息,错误信息。
jwt与传统token的区别?
传统token方式:
用户登陆成功后,服务端生成一个随机token给用户,并且在服务端(数据库或者缓存)中保存一份token,以后用户再来访问时需要携带token,服务端接收到token后,去数据库或者缓存中进去检验token是否超时,是否合法。
jwt方式:
用户登陆成功后,服务端通过jwt生成一个随机token给用户(服务端并不保存token),以后用户再来访问时携带token,服务端接收到token通过jwt对token进行合法性,超时校验
可以看到jwt的优势在于:
数据只保存在客户端(浏览器),不需要数据库查询扣件。安全性。有超时时间验证(传统token也可在数据库中进行时间校验)
但jwt也存在一点问题,在超时时间内,token都是合法的,无法手动使其失效,因为服务端并没有保存数据。
jwt原理:
jwt生成的token由三部分,由两个点隔开。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikpva
G4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
生成规则如下:
第一部分Header,它包含算法信息和token类型,对此json数据进行base64url加密,形成token的第一段字符串。
{
"alg": "HS256",
"typ": "JWT"
}
第二段payload(负载,携带请求信息)部分,包含请求的用户信息,超时时间,对此json进行base64url加密,形成token的第二段字符串。
{
"name": "John Doe",
"password":"123",
"delt": 1516239022
...
}
第三段Signature部分,把前再做的base密文通过.(点号)拼接起来,然后对其进行HS256加密,再对hs256密文进行base64url加密,最终得到token的第三段。
base64url(
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
your-256-bit-secret
)
)
默认情况下,这个加盐是django项目的secret_key.
再然后通过.将三段字符串连接起来,即形成了token
base64url加密是先做base64加密,然后再将-替代+及——替代/