JWT(JSON Web Token )详解及实例

这篇具有很好参考价值的文章主要介绍了JWT(JSON Web Token )详解及实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是 JWT ?

二、什么时候使用 JWT ?

三、JWT 格式

1、Header

2、Payload

3、Signature

4、 JWT实现:


官网

  • 官网 JSON Web Tokens - jwt.io
  • RFC 7519文档 RFC 7519: JSON Web Token (JWT)

一、什么是 JWT ?

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。
JWT可以使用密码(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

加签后的token 能够使用 JWT 里的算法验证 json 的完整性.

二、什么时候使用 JWT ?

  1. 授权
  2. 信息交换
  3. 使用方式:服务端根据规范生成一个令牌(token),并且发放给客户端(保存在客户端)。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。
  4. 前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题)

JWT优势
    简洁:可以通过URL、POST参数或者在HTTP Header发送,因为数据量小,传输速度也很快
    自包含:负载中包含了所有用户所需要的信息,避免了多次查询数据库
    因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式       都支持
    不需要在服务端保存会话信息,特别适合用于分布式微服务。
    更适合用于移动端:当客户端是非浏览器平台时,cookie是不被支持的,此时使用token认证方       式会简单很多
     单点登录友好:由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话,            token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会          存在这些问题
 

三、JWT 格式

使用逗号分隔的三部分 :

  • Header
  • Payload
  • Signature
    token 格式:xxxxx.yyyyy.zzzzz

1、Header

Header 通常由 token 类型和签名算法名两部分组成.是token的第1部分
例如:

{
"alg": "HS256", // 签名算法
"typ": "JWT" // token类型
}

然后, 这个JSON 使用 Base64Url 编码后放到 JWT 的第1部分.

2、Payload

Payload 是token的第2部分.包含了一些声明(claims).声明的名字必须是唯一的.
claims 是包含了 用户数据和其他数据的陈述,

有三种类型的声明:

  1. Registered Claim Name
    预定义好的一些声明(如果有需要就使用,没需要可不使用):
  • "iss"
  • "sub"
  • "aud"
  • "exp"
  • "nbf"
  • "iat"
  • "jti"

更多参见 JSON Web Token (JWT)

  1. Public Claim Names
    公共的声明,可以预先定义在 IANA JSON Web Token Registry 中,或者定义在1个能解决名字冲突的地方.

  2. Private Claim Names
    双方共享数据使用的私有名字.既不在 Registered Claim Name 也不在 Public Claim Names 中.

payload 示例

{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

JSON 

然后, 这个JSON 使用 Base64Url 编码后放到 JWT 的第2部分.

3、Signature

拿到编码后的 header 和 编码后的 payload 使用 密码进行签名.

使用 HMAC SHA256 加签示例:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

Signature需要使用编码后的header和payload以及我们提供的一个秘钥,然后使用header中指定的签名算法进行签名,签名的作用是保证JWT没有被篡改过

HMACSHA256(base64UrlEncode(header)+“.”+base64UrlEncode(payload),secret)

实际上是对头部信息和负载内容进行签名,防止内容被篡改,如果有人对头部以及负载内容解码后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT上附带的签名是不一样的。如果要对新的头部和负载进行签名,由于不知道服务器加密时使用的秘钥,得出来的结果也是不一样的

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。

4、 JWT实现:

  1、依赖引入

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jwt-jsonwebtoken.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>RELEASE</version>
        </dependency>

2、生成Token 

// 签名密钥
 private static final String SECRET = "!Doker$";
public String createToken(Map<String, Object> claims, String subject) {
        final Date createdDate = clock.now();
        final Date expirationDate = calculateExpirationDate(createdDate);
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(createdDate)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, Algorithm.HMAC256(SECRET))
                .compact();
    }

    private Date calculateExpirationDate(Date createdDate) {
        return new Date(createdDate.getTime() + expiration * 1000);
    }

3、刷新Token 

public String RefreshToken(String token) {
        final Date createdDate = clock.now();
        final Date expirationDate = calculateExpirationDate(createdDate);
        final Claims claims = getAllClaimsFromToken(token);
        claims.setIssuedAt(createdDate);
        claims.setExpiration(expirationDate);
        return Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, Secret)
                .compact();
    }

4、token发送给前端
传入当前用户的功能与用户信息,登录名生成token,写入response的返回头中,前端获取后保存在前端的本地缓存中,后续前端请求要把token放在头header里。

//登录成功之后
List<Object> functs=(List<Object>) authResult.getAuthorities();
//当前功能列表
String loginName=authResult.getName();//登录名
Users obj=(Users)authResult.getPrincipal();//用户信息
String token=JwtUtil.createToken(loginName,functs,obj);

//生成token  TOKEN_HEADER= Authorization TOKEN_PREFIX=Bearer token值
response.setHeader(JwtUtil.TOKEN_HEADER,JwtUtil.TOKEN_PREFIX+token);
response.setContentType("application/json;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK); //个人编写的视图对象
DTO dto=new DTO<>();
dto.setCode("000000");
dto.setMessage("认证通过");

PrintWriter pw=response.getWriter();
pw.write(JsonUtil.set(dto));//写入json
pw.flush();//强制刷新
pw.close();//关闭流

5、验证用户请求携带token文章来源地址https://www.toymoban.com/news/detail-738180.html

String header = request.getHeader(JwtUtil.TOKEN_HEADER);
 if (null == header || !header.toLowerCase().startsWith(JwtUtil.TOKEN_PREFIX)) { 
  // 如果头部 Authorization 未设置或者不是 basic 认证头部,则当前 
  // 请求不是该过滤器关注的对象,直接放行,继续filter chain 的执行
   chain.doFilter(request, response);
   return;
} 

try {
  String token = header.replace(JwtUtil.TOKEN_PREFIX, ""); 
  // 验证token是否过期
  if (JwtUtil.isExpiration(token)) { 
      throw new javax.security.sasl.AuthenticationException("token 验证不通过");
} 

//檢查token是否能解析
Users user = (Users) JwtUtil.getUser(token); 
if (null == user) { 
    throw new javax.security.sasl.AuthenticationException("token 验证不通过");
} 

//验证成功

到了这里,关于JWT(JSON Web Token )详解及实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是JWT(JSON Web Token)?

    JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传递信息的安全传输方式。它通过数字签名来验证信息的合法性,并且具有自包含性,即它包含了足够的信息以供验证和识别。 JWT通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 1. 头部(

    2024年02月12日
    浏览(48)
  • JWT(Json Web Token)的原理、渗透与防御

    (关于JWT kid安全部分后期整理完毕再进行更新~2023.05.16) JWT全称为Json web token,是为了在网络应用环境间传递声明而执行的一中基于JSON的开放标准。常用于分布式站点的单点登录。 JWT的声明一般被用在客户端与服务端之间传递身份认证信息,便于向服务端请求资源。 (我理

    2024年02月05日
    浏览(39)
  • io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT val

    io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.     at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:354)     at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:481)     at io.jsonwebtoken.impl.DefaultJwtParse

    2024年02月03日
    浏览(30)
  • 解锁互联网安全的新钥匙:JWT(JSON Web Token)

    目录 前言 一、JWT简介 1. 什么是JWT? ​编辑 2. JWT的工作原理 3.JWT如何工作的 4. JWT的优势 5. 在实际应用中使用JWT 6.传统Session和JWT认证的区别 6.1.session认证方式 6.2.JWT认证方式 7.基于Token的身份认证 与 基于服务器的身份认证  二、JWT的结构 (1) Header (2) Payload (3) Signature  三、

    2024年02月08日
    浏览(45)
  • Jwt(Json web token)——使用token的权限验证方法 & 用户+角色+权限表设计 & SpringBoot项目应用

    1.认证鉴权服务,注册中心,认证中心,鉴权中心; 2.用户,角色,权限表设计,数据库视图的使用; 3.项目中的应用,使用自定义注解+拦截器; 4.枚举类型的json化, @JsonFormat(shape = JsonFormat.Shape.OBJECT) @Getter https://gitee.com/pet365/springboot-privs-token 用户和权限之间关系(多对多

    2024年02月14日
    浏览(75)
  • 分布式环境集成JWT(Java Web Token)

    Token的引入:客户端向服务端请求数据时一般都会加入验证信息,比如客户端在请求的信息中携带用户名、密码,服务端会校验用户名和密码是否正确,校验通过响应该客户端请求。但是每次都携带用户名和密码无疑有些繁琐,而且也不安全,在这种背景下,Token便应运而生。

    2024年02月11日
    浏览(48)
  • python3 Flask jwt 简易token认证实例

        chatgpt写的代码

    2024年02月22日
    浏览(47)
  • jwt,accesstoken、refresh token详解

    JWT(json web token) 概念 JWT定义了一种紧凑的,自包含的形式,被用作在网络中安全的传输信息 格式 例如:xxxx.yyyyyyy.zzz 根据.分割,可以得到三部分,header,payload,signature。每部分可以使用Base64解码,就是一个JSON对象。 payload中会包含当前jwt的颁发者信息,JWT有效期,用户的凭证

    2024年02月16日
    浏览(57)
  • JWT详解、JJWT使用、token 令牌

    在正式讲解JWT之前,我们先重温一下用户身份认证相关的一些概念: 服务器当中记录每一次的登录信息,从而根据客户端发送的数据来判断登录过来的用户是否合法。 缺点: 每个用户登录信息都会保存到服务器的session中,随着用户的增多服务器的开销会明显增大; 由于s

    2024年01月21日
    浏览(74)
  • JSON Web Token

    JWT: 概念: 通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全地将信息作为 JSON 对象,安全地传输信息 在数据传输过程中可以对数据进行加密,签名等处理 开销小,可在多种域中使用 授权 一旦用户登录,每个后续请求将包括 JWT ,从而允许用户访问该令牌允许的路

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包