JWT详解

一、简单介绍

JSON Web Token (JWT)是一个开放行业标准,其RFC标准记录在RFC 7519中,JWT本质上是一个字符串,JWT标准常用于认证(authentication)、授权(Authorization)、安全信息交换(Information Exchange)领域。

二、JWT 构成

JSON Web Token (JWT) 由Header、Payload、Signature三部分组成,这三部分由.(dot)分隔开。所以一个JWT字符串通常如下所示 :

xxxxxx.yyyyyy.zzzzzz

1、Header

header一般包含两部分:token的类型,一般是JWT;签名(sign)的算法,一般是HMAC、SHA256 或者 RSA等,举例如下:

bash 复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}

该JSON数据会被Base64Url 编码,编码之后的字符串作为Token的第一部分xxxxxx;Base64Url与Base64相关介绍在另一篇文章中。

2、Payload

Token的第二部分是payload,payload包含claims(声明),claim一般包含用户数据和其他额外的数据。claim一般分为三种:registered, public, and private claims。

Registered claims(注册声明)

这部分声明是预定义的声明,这些声明不是必需的,但是建议使用,以提供一组有用的、可互操作的声明。相关的声明如下:

claim 描述
iss (Issuer) Claim,确定签发者的身份,谁签的该token,即该服务器的地址
sub (Subject) Claim, jwt所面向的用户
aud (Audience) Claim

该JSON数据会被Base64Url 编码,编码之后的字符串作为Token的第二部分yyyyyy。

3、signature(签名)

这一部分需要Base64Url 加密后的header和Base64Url 加密后的Payload,并将两者用dot(.)连接起来,组成一个签名前的字符串;然后使用加密算法加上secret或者公私钥加密成签名。该签名将作为Token的第三部分zzzzzz。

在实际应用中,因为Header和Payload会存储很多数据,如果再使用加密算法,生成的数据会更多,这无疑会降低传输效率,所以更常见的用法是先将Header和Payload做数字摘要,然后对数字摘要加密,这样数据量会降低很多。在JWT中有两种签名方式,一种是使用对称加密算法配合secret(盐)进行加密,加解密都会使用到该secret,另一种方式使用非对称加密,通常是服务器使用私钥签名,然后随着请求处理再用公钥验证

三、使用

JWT通常使用在http服务中,用作认证和授权,并且不存储在cookie中,因为使用cookie认证有访问域的限制,而是放在http请求头部,这样的话并没有访问域的限制,并且不需要seesion的参与形式如下:

javascript 复制代码
## Bearer token两者之间是一个空格
Authorization: Bearer token

引用

JWT RFC 7519

相关推荐
ん贤9 天前
JWT基础详解
开发语言·go·jwt
发粪的屎壳郎10 天前
ASP .NET Core 8结合JWT轻松实现身份验证和授权
jwt·asp .net core
quweiie13 天前
tp8.0\jwt接口安全验证
前端·安全·jwt·thinkphp
百锦再21 天前
服务器间接口安全问题的全面分析
运维·服务器·安全·api·jwt·token·net
ArabySide22 天前
【WCF】通过AOP实现基于JWT的授权与鉴权的实践
c#·jwt·aop·wcf
ZHOU_WUYI1 个月前
flask JWT 认证
后端·flask·jwt
小小工匠1 个月前
每日一博 - JWT 安全实战指南
安全·jwt
FungLeo2 个月前
NodeJS Koa 后端用户会话管理,JWT, Session,长短Token,本文一次性讲明白
jwt·token·session·会话管理·cookies
14L2 个月前
互联网大厂Java面试:从Spring Cloud到Kafka的技术考察
spring boot·redis·spring cloud·kafka·jwt·oauth2·java面试
失败尽是常态Z2 个月前
基于JWT+Redis的登录流程实现
java·数据库·redis·状态模式·jwt·用户登录