这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
以前在学习后端开发时曾经听说过用token来作为用户登录的凭证,但一直没用过token。这次做青训营的大项目刚好要用到token,作为用户的鉴权。于是和小伙伴商量了一波,使用了JWT token,这篇笔记简要的介绍一下JWT token。
JWT
全称为JSON Web Token,是一种前后端进行用户身份认证的规范。它主要由头部、载荷和签名组成。头部和载荷在编码的过程中都经过Base64编码,其中签名部分会进行加密,形成最终的JWT。
因此,一个JWT Token一般由右边的形式构成:xxxxx.yyyyy.zzzzz,分别代表头部、载荷和签名。
头部
头部通常由两部分组成,一是token的类型,即JWT;二是签名所用的加密算法,如HMAC、SHA256、RSA。综合起来,头部的JSON块如下:
{
"alg": "HS256",
"typ": "JWT"
}
随后,这个JSON块将会用BASE64进行编码,组合JWT的第一部分:ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9
载荷
载荷主要由各种claims组成,在这一部分可以对用户信息等进行记录,具体例子可以看下面的JSON块:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
上面的JSON块就通过三个字段信息记录了一个用户的一些信息,如编号、名字、是否为管理员,这个JSON块将会同样被BASE64编码,从而得到JWT的第二部分:eyAKICAgICJzdWIiOiAiMTIzNDU2Nzg5MCIsIAogICAgIm5hbWUiOiAiSm9obiBEb2UiLCAKICAgICJhZG1pbiI6IHRydWUgCn0=
签名
作为一种用户认证方式,仅仅使用编码是远远不够的,那么它的安全性就在这第三部分来保证。第三部分的核心使用一种加密算法将第一部分与第二部分的编码串及一个secret密钥进行加密,作为签名使用,可以验证传输的数据是否被修改。若使用HMAC SHA256算法进行加密,则该过程可以用以下伪代码描述:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload), secret
)
其中,secret可以自行指定,可以是任一字符串。
总结
这篇文章简要地介绍了一下JWT的组成部分,各种编程语言都提供了JWT的接口,在编程实践中也十分方便,本次项目使用了jwt-go,后续会根据项目进展更新编码实践部分。