jwt实现token认证 | 青训营笔记

103 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天。

大作业里需要实现用户登录的token认证的功能,在此对相关的学习进行记录。

1. 背景分析

我们先看看如果不使用token如何实现用户认证。传统的方法是对每一个用户都建立一个session,服务端对用户名密码校验后会生成一份保存当前用户信息的session和一个对应的session_id,服务端的返回中,包含session_id会写入浏览器cookie,之后再次访问服务端,会将cookie和session_id一并返回,从而实现持续对用户登录状态的认证。

但是这样缺点也很明显,它极度依赖浏览器保存cookie机制,有的环境并不支持cookie,而且cookie也容易被截获。并且在服务端,需要为每一个账号都创建一个session来保存相关信息,会消耗服务端资源。

2. jwt-token

jwt全名(json web token),是一种跨域的认证的解决方案,属于一个开放的标准。使用其规定了一种token的实现方式。

jwt-token由三部分组成,header + payload + signature组成。公式如下:

JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret) 

  • header部分是一个json对象
{
  "typ": "JWT",
   "alg": 加密方法,例如(HS256)
}
  • payload
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT
  • Signature: 对前文上面两部分的数据进行签名,使用base64编码后的数据再通生成不可逆的哈希(不可逆),另外,还需要一个密钥secret,该secret仅仅保存在服务端,并且不可公开。公式如下:

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

用户每次登陆后,通过从服务端获取对应的token,从而通过认证,在具体请求中携带服务端授予的token,服务端,通过对token的解析验证,确保本次起请求的正确。