[JWT][JAVA]JSON Web Tokens的简单使用(java-jwt)

本文详细介绍了JWT的原理和结构,包括JWT的头部、载荷和签名三部分,并提供了Java环境下使用java-jwt库的实践样例代码,帮助理解JWT在认证和信息交换中的应用。
摘要由CSDN通过智能技术生成


前导

前一篇中介绍了Token的机制以及一个简单实现了一个Token管理类。
这篇中介绍的是现有的工业化框架—— JWT (JSON Web Tokens)。

JWT简介

什么是JWT

概括来说,JWT是一种符合RFC 7519工业体系设计的、基于JSON对象的、利用RSA等算法签发的Token框架/标准。

  • JWT在通常情况下,并不对Token数据进行加密(和上一篇中简单利用数字摘要技术产生的Token不同,JWT签发的Token是可以进行逆向解码的),只关注于Token令牌本身的签发时效性、完整性、合法性。
  • JWT同样可以利用加密手段对Token进行签发。但通常来说并不推荐这么做,相比于利用HTTP传递一个经过JWT加密的Token,更好的做法是利用HTTPS传递一个Token。同时也不建议在JWT签发的Token中传递敏感信息——但合理的利用加密Token传递数据可以有效减轻服务器负载。

对于JWT,它的通用环境主要有两种:

  • 认证:广泛应用于分布式集群网络、跨域访问和单页面应用等。
  • 信息交换:尽管这不是个很安全的做法,但合理利用JWT,基于数据层安全协议可以有效减轻服务器频繁读取所造成的负载。

注:官方对此有更详细的说明:

  • Authorization: This is the most common scenario for using JWT. Once the user is logged in, each subsequent request will include the JWT, allowing the user to access routes, services, and resources that are permitted with that token. Single Sign On is a feature that widely uses JWT nowadays, because of its small overhead and its ability to be easily used across different domains.
  • Information Exchange: JSON Web Tokens are a good way of securely transmitting information between parties. Because JWTs can be signed—for example, using public/private key pairs—you can be sure the senders are who they say they are. Additionally, as the signature is calculated using the header and the payload, you can also verify that the content hasn’t been tampered with.

跨语言的特点

JWT是一套框架和标准,其实现含有JavaPythonC#Node.js,每种语言也有不同的实现库。因此,基于JWT可以实现跨语言的Token签发、认证、解码。

Ref: JWT.IO-Libraries for Token Signing/Verification

主体结构

JWT的主体结构为:

  • Header
  • Payload
  • Signature

习惯上分别将之称作头部、载荷、签名。

大部分时候,我们在代码中只关心头部中的加密算法和载荷中的信息。

1 头部(Header)

头部主要包含两类信息,加密算法(alg)和令牌签发类型(typ),一个示例如下:

{
   
  "alg": "HS256",
  "typ": "JWT"
}
  • 注意:出于简洁和数据传输时的开销考虑,每个JSON字符串的索引都是三个字符的缩写,如alg(algorithm)。

2 载荷(Payload)

  • 载荷是我们在编程中需要着重关注和实现的地方。

载荷包含三种声明域(Claims):

  1. 签发域(Registered claims)

Ref:签发域标准——RFC 7519:Registered Claim Names

签发域是我们需要着重关注和了解的第一个域。其中重中之重主要有四个:iss(issuer),exp(expiration time),sub(subject),aud(audience)。但此处将会把每一个都罗列:

缩写 子域名 说明
iss Issuer *(必需项) 签发此Token的发行者,如 CSDN
sub Subject 标识主体,用于识
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值