Token(令牌)认证机制————JJWT(Java JSON Web Token)

1、JWT是什么

引自官网原话:
  JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方间以JSON对象形式使信息安全传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用私密的(使用HMAC算法)或使用RSA或ECDSA的公用/专用密钥对JWT进行签名。

自包含:token串包含很多信息,比如用户的Id、角色等,别人拿到这个串,就能拿到这些关键的业务信息,从而避免再通过数据库查询等方式得到它们。

JWT通常由三部分组成: 头信息(header)、消息体(payload)、签名(signature)。头信息和消息体由Base64Url编码,签名通过具体算法编码,且由点(.)分隔:

xxxxx.yyyyy.zzzzz
  • header由两部分组成:Token的类型(即JWT)和所使用的签名算法
{
  "alg": "HS256",						--签名算法
  "typ": "JWT"							--类型
}
  • payload是JWT的主体内容部分,包含需要传输的数据,提供了七个默认字段:
{
  "iss": "xxx",							--发行人
  "exp": "xxx",							--到期时间
  "sub": "xxx",							--主题
  "aud": "xxx",							--用户
  "nbf": "xxx",							--在此之前不可用
  "iat": "xxx",							--发布时间
  "jti": "xxx",							--JWT ID用于识别
  
  --也可自定义字段
  "name": "CSDN",					
  "admin": true
}
[注意]JWT不是加密串,建议不要包含私密信息的自定义字段。
  • signature用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实身份。
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
[注意]:secret

Token = base64UrlEncode(header) +" . "+ base64UrlEncode(payload) + " . " + HMACSHA256(…);

2、为什么用JWT

  近年来RESTful Web Service 开始风靡,使用HTTP header来传递认证令牌似乎变得理所应当,而单页应用(SPA)、前后端分离架构似乎正在促成越来越多的WEB应用放弃历史悠久的cookie-session认证机制,转而使用JWT来管理用户session。

  • cookie-session模式回顾
      在cookie-session方案中,cookie内仅包含一个session标识符,而诸如用户信息、授权列表等都保存在服务端的session中。浏览器只保存session Id(当然你可以保存更多额外的东西),服务端根据session Id再去读取状态(用户权限之类),可以理解为双方被月老牵了红线,会话通信期间有个保持,使用session-cookie意味着stateful;
      JWT则可以把权限控制信息和更多的内容传递给浏览器或其他终端(mobile等)使用,服务端(auth服务器)负责发放JWT,类比保险箱给你发钥匙,你只要有钥匙,什么时候开都行,不需要在客户端和真正的资源服务器间绑定关系,也就是stateless。

  • SWT、SAML、JWT的比较
      由于JSON没有XML那么冗长,因此在编码时JSON的体积较小,从而使JWT比SAML更为紧凑。这使得JWT是在HTML和HTTP环境中传递的不错的选择。
      在安全方面,只能使用HMAC算法由共享机密对SWT进行对称签名。但是JWT和SAML令牌可以使用X.509证书形式的公用/专用密钥对进行签名。与签名JSON的简单性相比,使用XML数字签名对XML进行签名而不引入模糊的安全漏洞是非常困难的。
      JSON解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML没有自然的文档到对象映射。与SAML断言相比,这使使用JWT更加容易。
      关于用法,JWT是在Internet规模上使用的。这强调了在多个平台(尤其是移动平台)上对JSON Web令牌进行客户端处理的简便性。

3、怎么用JWT

  客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。然后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。

Authorization: Bearer < Token >

当跨域时,也可以将JWT被放置于POST请求的数据主体中。

你可能感兴趣的:(Java,EE)