这是我参与「第五届青训营 」伴学笔记创作活动的第 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的解析验证,确保本次起请求的正确。