前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JWT (Json Web Token)教程

JWT (Json Web Token)教程

作者头像
allsmallpig
发布2021-02-12 10:03:50
7690
发布2021-02-12 10:03:50
举报
文章被收录于专栏:allsmallpi博客allsmallpi博客

JWT(Json Web Token)是实现token技术的一种解决方案,JWT由三部分组成:  header(头)payload(载体)signature(签名)

JWT第一部分是header,header主要包含两个部分,alg指加密类型,可选值为HS256RSA等等,typ=JWT为固定值,表示token的类型。。

代码语言:javascript
复制
{
    "typ": "JWT",
    "alg": "HS256"
}
载体

JWT第二部分是payload,payload是token的详细内容,一般包括iss (发行者), exp (过期时间), sub(用户信息), aud (接收者),以及其他信息,详细介绍请参考官网,也可以包含自定义字段。

代码语言:javascript
复制
{
    "iat": 1493090001,
    "name": "张三"
}
代码语言:javascript
复制
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
签名

JWT第二部分是signature,这部分的内容是这样计算得来的:

Base64(header).Base64(payload)得到一个Base64编码的字符串(下文成EncodeString) HS256(EncodeString,"秘钥");计算得到的即使签名。 计算得到上面三部分内容后,用.连接起来就是一个完整的 JWT TOKEN,秘钥是保存在服务器上的一个私有密钥。

将头部、声明、签名用.号连在一起就得到了我们要的JWT。

代码语言:javascript
复制
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ
和Session方式存储id的差异

Session方式存储用户id的最大弊病在于要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如用户角色,用户性别等。

java 使用 jwt

引入jar

代码语言:javascript
复制
<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
    <version>0.9.0version>
dependency>

demo

代码语言:javascript
复制
package user;

import io.jsonwebtoken.*;
import org.joda.time.DateTime;
import org.junit.Test;

import java.util.Date;

public class JWT {
    private static final String PRIVATE_KEY = "123456789";

    @Test
    public void jwtTest() throws InterruptedException {
        // 设置3秒后过期
        String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());
        System.out.println(jwt);
        // 验证token是否可用
        boolean isOk = this.isJwtValid(jwt);
        System.out.println(isOk);
    }

    public String buildJwt(Date exp) {
        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,这里使用额是HS256加密算法
                .setExpiration(exp)//expTime是过期时间
                .claim("key", "vaule")//该方法是在JWT中加入值为vaule的key字段
                .compact();
        return jwt;
    }

    public boolean isJwtValid(String jwt) {
        try {
            //解析JWT字符串中的数据,并进行最基础的验证
            Claims claims = Jwts.parser()
                    .setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法对应的密钥,jjwt可以自动判断机密算法
                    .parseClaimsJws(jwt)//jwt是JWT字符串
                    .getBody();
            String vaule = claims.get("key", String.class);//获取自定义字段key
            //判断自定义字段是否正确
            if ("vaule".equals(vaule)) {
                return true;
            } else {
                return false;
            }
        }
        //在解析JWT字符串时,如果密钥不正确,将会解析失败,抛出SignatureException异常,说明该JWT字符串是伪造的
        //在解析JWT字符串时,如果‘过期时间字段’已经早于当前时间,将会抛出ExpiredJwtException异常,说明本次请求已经失效
        catch (SignatureException | ExpiredJwtException e) {
            return false;
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 载体
  • 签名
  • 和Session方式存储id的差异
  • java 使用 jwt
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档