Json Web Token(JWT)

Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

组成

由句号分隔的三段base64串b1.b2.b3,如:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM

  • header:头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等,为json格式。用base64转成一个串b1。
  • paload:放入一些自定义信息,为json格式。用base64转成一个串b2。jwt预放入了五个字段:
    • iss: 该JWT的签发者
    • sub: 该JWT所面向的用户
    • aud: 接收该JWT的一方
    • exp(expires): 什么时候过期,这里是一个Unix时间戳
    • iat(issued at): 在什么时候签发的
  • signature:用header中所声明的加密方法(需要为之提供一个key)将 base64( header).base64(paload) 加密得到第三个base64串b3。

校验原理

由于用base64,所以可以直接逆转码提取header、payload信息。服务端收到token后会根据header声明的加密算法再计算下signature,若与token中的signature不同则当成未授权的token。

功能

(与传统session或token的区别):

  • 适合用于向Web应用传递一些非敏感信息如userId、isAdmin等,不能包含密码等敏感信息;
  • 本身具备失效判断机制:根据串本身就能知道该token是否失效,而不用自己出来了;
  • 服务端不需要存储token,而是分散给各个客户端存储,session机制则要。有利就有弊,jwt增加了计算开销如加解密,但总的利大于弊。
  • 服务端能识别被篡改的token,所以只要token校验通过,就可以把里面封装的信息当成可信的。

使用示例

依赖:

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>

代码:

 1 import java.security.Key;
 2
 3 import io.jsonwebtoken.Claims;
 4 import io.jsonwebtoken.ExpiredJwtException;
 5 import io.jsonwebtoken.Jws;
 6 import io.jsonwebtoken.Jwts;
 7 import io.jsonwebtoken.MalformedJwtException;
 8 import io.jsonwebtoken.SignatureAlgorithm;
 9 import io.jsonwebtoken.SignatureException;
10 import io.jsonwebtoken.impl.crypto.MacProvider;
11
12 public class JWTtest {
13
14     public static void main(String[] args) {
15         // 生成jwt
16         Key key = MacProvider.generateKey();// 这里是加密解密的key。
17         String compactJws = Jwts.builder()// 返回的字符串便是我们的jwt串了
18                 .setSubject("Joe")// 设置主题
19                 .claim("studentId", 2)// 添加自定义数据
20                 .signWith(SignatureAlgorithm.HS512, key)// 设置算法(必须)
21                 .compact();// 这个是全部设置完成后拼成jwt串的方法
22         System.out.println("the generated token is: " + compactJws);
23
24         // 解析jwt
25         try {
26
27             Jws<Claims> parseClaimsJws = Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);// compactJws为jwt字符串
28             Claims body = parseClaimsJws.getBody();// 得到body后我们可以从body中获取我们需要的信息
29             // 比如 获取主题,当然,这是我们在生成jwt字符串的时候就已经存进来的
30             String subject = body.getSubject();
31             System.out.println("the subject is: " + subject);
32             System.out.println("the studentId is: " + body.get("studentId"));
33
34             // OK, we can trust this JWT
35
36         } catch (SignatureException | MalformedJwtException e) {
37             // TODO: handle exception
38             // don‘t trust the JWT!
39             // jwt 解析错误
40         } catch (ExpiredJwtException e) {
41             // TODO: handle exception
42             // jwt 已经过期,在设置jwt的时候如果设置了过期时间,这里会自动判断jwt是否已经过期,如果过期则会抛出这个异常,我们可以抓住这个异常并作相关处理。
43         }
44     }
45 }

参考资料

  • Json Web Token:http://blog.leapoahead.com/2015/09/06/understanding-jwt/
  • Json Web Token单点登录:http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/

原文地址:https://www.cnblogs.com/z-sm/p/9125995.html

时间: 2024-08-28 19:23:55

Json Web Token(JWT)的相关文章

JSON WEB TOKEN(JWT)的分析

JSON WEB TOKEN(JWT)的分析 一般情况下,客户的会话数据会存在文件中,或者引入redis来存储,实现session的管理,但是这样操作会存在一些问题,使用文件来存储的时候,在多台机器上,比较难实现共享,使用redis来存储的时候,则需要引入多一个集群,这样会增加管理的工作量,也不方便.有一个直观的办法,就是将session数据,存储在客户端中,使用签名校验数据是否有篡改,客户请求的时候,把session数据带上,获取里面的数据,通过校验,然后进行身份认证. 数据存储在客户端中,会

Spring Boot集成JSON Web Token(JWT)

一:认证 在了解JWT之前先来回顾一下传统session认证和基于token认证. 1.1 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用户名和密码来进行认证.当浏览器第一次访问服务器(假设是登录接口),服务器验证用户名和密码之后,服务器会生成一个sessionid(只有第一次会生成,其它会使用同一个sessionid),并将该session和用户信息关联起来,然后将s

JSON Web令牌(JWT)

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 1.跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 1.用户向服务器发送用户名和密码. 2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中. 3.服务器向用户返回session_id,session信息都会写入到用户的Cookie. 4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器. 5.服务器收到session_id并对比之前保存的数据,确认

JSON Web Tokens(JWT)

现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证.它有以下特点: JWT是跨不同语言的,JWT可以在 .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript和Haskell中使用 JWT是自我包涵的,它们包含了必要的所有信息,这就意味着JWT能够传递关于它自己的基本信息,比如用户信息和签名等. JWT传递是容易的,因为JWT是自我包涵,它们能被完美用在HTTP头部中,当需

什么是JWT(JSON WEB TOKEN)

什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密. 起源 说起JWT,我们应该来谈一谈基于token的认证和传统的Session认证的区别

深入浅出JWT(JSON Web Token )

原文:深入浅出JWT(JSON Web Token ) 1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行验证和信任. 可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名. 虽然JWT可以加密以提供各方之间的保密性,但我们将重点关注已签名的令牌. 签名的令牌可以验证其中包含的

什么是 JWT -- JSON WEB TOKEN

转自于:http://www.jianshu.com/p/576dbf44b2ae 什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密. 起

JSON Web Token - 在Web应用间安全地传递信息

转载自:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A用户关注了B用户的时候,系统发邮件给B用户,并且附有一个链接"点此关注A用户".链接的地址可以是这样的 1 https://your.awesome-app.com/make-friend/?from_user=

JSON Web Token - 在Web应用间安全地传递信息(zhuan)

来自 http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A用户关注了B用户的时候,系统发邮件给B用户,并且附有一个链接"点此关注A用户".链接的地址可以是这样的 1 https://your.awesome-app.com/make-friend/?from_user=B