jwt详解

作者: pilisiyang | 来源:发表于2019-11-18 14:13 被阅读0次

什么是JWT?

JWT全称是JSON Web Token是一个开放标准(RFC 7519),目前最流行的跨域身份验证解决方案。

它定义了一种经过加密的格式,放在json对象在请求中传递,用于验证请求是否被允许访问。

JWT的原理

服务器经过认证以后,会生成加密串返回前台,结构如下图:


JSON Web Token由三部分组成,它们之间用.连接。

* Header 头部
* Payload 负载
* Signature 签名

Header

Header 部分用Base64URL解密后是一个JSON对象,主要描述了签名的算法和令牌类型。

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

alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。

Payload

Payload 部分同样也是一个JSON对象,它包含Claim。

Claim中存的就是这些字段,有三种类型:

  • Registered claims 预定义的声明
  • Public claims 公开声明
  • Private claims 私有声明

JWT 规定了7个Registered claims

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号
    /**
     * 从payload中拿到Claim
     *
     * @param token
     * @return
     */
    public Claims getClaimsFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }

需要注意的是JWT的信息默认是不加密的,Payload传递的不要有秘密信息。

Signature

Signature 部分是对前两部分的签名,用来防止数据篡改。

服务端指定密钥(secret),使用Header指定的签名算法,用转码后的JWT串产生签名。

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

在项目中使用了用 jjwt 生成:

    String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(generateExpirationDate(claims.get(CLAIM_KEY_USERNAME)))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

Base64URL

Base64URL 是一种能够对 URL 进行 base64 串型化的算法。

在目前项目中的外部接入管理里,需要将 url 放入到 Payload 中,如果直接使用的 Base64 算法,会与特殊符号+、/和=冲突,Base64URL会将 =省略、+替换成-,/替换成_。

JWT使用方式

客户端收到服务器返回的 JWT,需要自己存储在 Cookie 或者 localStorage中。

此后的每一次请求都必须带上这个 JWT,放在 cookie 中是无法跨域的,所以我们需要在 HTTP 请求的头信息或者参数中带上。

JWT的特点与session的差异

首先要明确,http协议是无状态的,每次请求对服务端而言,是不清楚上一次请求的认证。

session 的做法是将已经认证过的用户信息存储在服务器,用户下次请求带上 Session ID,服务器依此判断用户是否认证过。
因此也带来了一些问题:

  • 开销: 用户信息保存在内存中,认证的用户越多,内存开销越大。
  • 扩展性:不方便扩展,虽然可以将session存储在redis中,但是对程序的稳定性又带来不确定
  • CORS:跨资源共享问题,调用从另一个域名下获取资源时,会遇到禁止请求。

与之相反的是 JWT 这种令牌认证方式,基于Token的身份认证是无状态的,服务器或者Session中不会存储任何用户信息,方便无状态的服务扩展,尤其适合做单点登录和手机端的鉴权。
但JWT也有不足,令牌一旦发出,是无法作废的,到期之前一直有效。

相关文章

  • Laravel 添加 jwt-auth

    JWT 完整使用详解(中文) https://laravel-china.org/articles/10885/f...

  • JWT详解

    一、什么是JWT JWT(JSON Web Token) 是一个开放标准(RFC 7519),它定义了一种紧凑的、...

  • jwt详解

    什么是JWT? JWT的原理 服务器经过认证以后,会生成加密串返回前台,结构如下图: Header Header ...

  • 解释一下什么是前后端分离的核心 JWT

    JWT 详解 JWT是为了在网络应用中,前后端交付中,进行页面传值的一种手段。该TOKEN 设计紧凑,安全,适用于...

  • JWT 完整使用详解

    原文:https://laravel-china.org/articles/10885/full-use-of-j...

  • JsonWebToken

    JWT (JsonWebToken) JWT官网['https://jwt.io/'] JWT简介 1.JWT(J...

  • koa-jwt 使用详解

    简介 github 原文翻译 koa-jwt 主要提供路有权限控制的功能,它会对需要限制的资源请求进行检查 tok...

  • JWT 扩展具体实现详解

    原文:https://laravel-china.org/articles/10889/detailed-impl...

  • JWT介绍和使用

    最权威网址 JWT官网: https://jwt.io/ 什么是JWT Json web token (JWT),...

  • JWT实现token验证

    JWT官网:https://jwt.io/[https://jwt.io/] JWT(Java版)的github地...

网友评论

      本文标题:jwt详解

      本文链接:https://www.haomeiwen.com/subject/phtbictx.html