JWT – just what?

24次阅读

共计 1789 个字符,预计需要花费 5 分钟才能阅读完成。

初见 JWT,不知所云,赶紧 Google(百度)一下,原来是跨域身份验证解决方案。
JWT 只是缩写,全拼则是 JSON Web Tokens,是目前流行的跨域认证解决方案,一种基于 JSON 的、用于在网络上声明某种主张的令牌(token)。
JWT 原理
jwt 验证方式是将用户信息通过加密生成 token,每次请求服务端只需要使用保存的密钥验证 token 的正确性,不用再保存任何 session 数据了,进而服务端变得无状态,容易实现拓展。
加密前的用户信息,如:
{
“username”: “vist”,
“role”: “admin”,
“expire”: “2018-12-08 20:20:20”
}
客户端收到的 token:
7cd357af816b907f2cc9acbe9c3b4625
JWT 结构
一个 token 分为 3 部分:

头部(header)
载荷(payload)
签名(signature)

3 个部分用“.”分隔,如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
头部
JWT 的头部分是一个 JSON 对象,描述元数据,通常是:
{
“typ”: “JWT”,
“alg”: “HS256”
}

typ 为声明类型,指定 “JWT”
alg 为加密的算法,默认是 “HS256”

也可以是下列中的算法:

JWS
算法名称
描述

HS256
HMAC256
HMAC with SHA-256

HS384
HMAC384
HMAC with SHA-384

HS512
HMAC512
HMAC with SHA-512

RS256
RSA256
RSASSA-PKCS1-v1_5 with SHA-256

RS384
RSA384
RSASSA-PKCS1-v1_5 with SHA-384

RS512
RSA512
RSASSA-PKCS1-v1_5 with SHA-512

ES256
ECDSA256
ECDSA with curve P-256 and SHA-256

ES384
ECDSA384
ECDSA with curve P-384 and SHA-384

ES512
ECDSA512
ECDSA with curve P-521 and SHA-512

载荷
载荷 (payload) 是数据的载体,用来存放实际需要传递的数据信息,也是一个 JSON 对象。JWT 官方推荐字段:

iss: jwt 签发者
sub: jwt 所面向的用户
aud: 接收 jwt 的一方
exp: jwt 的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该 jwt 都是不可用的.
iat: jwt 的签发时间
jti: jwt 的唯一身份标识,主要用来作为一次性 token, 从而回避重放攻击。

也可以使用自定义字段,如:
{
“username”: “vist”,
“role”: “admin”
}
签名
签名部分是对前两部分 (头部,载荷) 的签名,防止数据篡改。
按下列步骤生成:1、先指定密钥 (secret)2、把头部(header) 和载荷 (payload) 信息分别 base64 转换 3、使用头部 (header) 指定的算法加密最终,签名(signature) = HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload),secret)
客户端得到的签名:
header.payload.signature
也可以对 JWT 进行再加密。
JWT 使用
1、服务端根据用户登录状态,将用户信息加密到 token 中,返给客户端 2、客户端收到服务端返回的 token,存储在 cookie 中 3、客户端和服务端每次通信都带上 token,可以放在 http 请求头信息中,如:Authorization 字段里面 4、服务端解密 token,验证内容,完成相应逻辑
JWT 特点

JWT 更加简洁,更适合在 HTML 和 HTTP 环境中传递
JWT 适合一次性验证,如:激活邮件
JWT 适合无状态认证
JWT 适合服务端 CDN 分发内容
相对于数据库 Session 查询更加省时
JWT 默认不加密
使用期间不可取消令牌或更改令牌的权限
JWT 建议使用 HTTPS 协议来传输代码

原文:https://www.bestvist.com/p/62

正文完
 0