JWT生成token的策略及具体实现

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/80795045
本文出自【我是干勾鱼的博客】

1 JWT是什么

JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。

2 JWT token的构成

JWT token分成3部分:

1 header:头部(header)
2 payload:载荷(payload)
3 signature:签证(signature)。

2.1 header

jwt的头部承载两部分信息:

声明类型,这里是jwt

声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON:

{
    "typ": "JWT",
    "alg": "HS256"
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

注意base64是对称加密,所以解密也很简单。

2.2 payload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

1 标准中注册的声明
2 公共的声明
3 私有的声明

2.2.1 标准中注册的声明 (这些声明都是官方建议,但不强制使用) :

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

2.2.2 公共的声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

2.2.3 私有的声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

定义一个payload:


{
    "name":"Free码农",
    "age":"28",
    "org":"今日头条"
}

然后将其进行base64加密,得到Jwt的第二部分:

eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUxNDM1NjEwMywiaWF0IjoxNTE0MzU2MDQzLCJhZ2UiOiIyOCJ9

2.3 signature

JWT的第3部分是一个signature签证信息,这个签证信息由3部分组成:

1 header (base64后的)
2 payload (base64后的)
3 secret

这个部分其实就是把:

base64加密后的header

base64加密后的payload

使用点符号“.”连接起来组成字一个字符串,然后再通过在header中声明的加密方式进行加盐secret组合加密,这样就构成了JWT的第三部分:

49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY

密钥secret是保存在服务端的,可以看做是服务器端私钥,服务端会根据这个密钥进行生成token,而且验证token合法性的时候也要用到它,所以一定要保护好。

3 使用JAVA实现JWT验证

具体实现方式可以参考使用JAVA实现JWT验证,使用maven建立的一个简单小程序的实现。使用的auth0来实现的,auth0的官方文档对JWT介绍的文章JSON Web Tokens (JWT) in Auth0也很详细,可以参考。

4 参考

JSON Web Tokens (JWT) in Auth0

JWT token心得与使用实例

国服最强JWT生成Token做登录校验讲解,看完保证你学会

JJWT创建和验证JWT

jwt的组成部分

基于Token的WEB后台认证机制

JWT的token,如果被截取了,再加以利用,不就没有用了么?

jwt的token被盗了怎么办?

你可能感兴趣的:(JWT,token)