springboot+springsecurity+jwt

什么是JWT——What is JSON Web Token?

首先JWT全称是JSON Web Token,它是根据开放标准RFC7519所定义的一个紧凑和独立的在各方安全的传输信息的JSON格式对象。它所传递的信息能够被验证和信任,因为它是数字签证。
以上是官方解释,大白话就是它是来做安全认证的,客户端和服务端的身份认证,可以通过JSON Web Token来做,当然使用springsecurity是足够的,但是springsecurity在进行跨域认证上就有些麻烦了。一般如果是跨域认证的话,spring security需要做session共享,配置一台专门的session共享服务器,该服务器保存连接的用户session信息,通过该服务器认证后即可访问相应的应用服务器。
典型的应用代表:单点登录,我怎么样在一个服务里访问另外一个服务,而不用再去重新登陆呢?session共享就可以做到了。

什么是跨域身份验证

互联网服务无法与用户身份验证分开。一般过程如下。
1.用户向服务器发送用户名和密码。
2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。
3.服务器向用户返回session_id,session信息都会写入到用户的Cookie。
4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。
5.服务器收到session_id并对比之前保存的数据,确认用户的身份
这种模式最大的问题是,没有分布式架构,无法支持横向扩展。如果使用一个服务器,该模式完全没有问题。但是,如果它是服务器群集或面向服务的跨域体系结构的话,则需要一个统一的session数据库库来保存会话数据实现共享,这样负载均衡下的每个服务器才可以正确的验证用户身份。
一种解决方案是听过持久化session数据,写入数据库或文件持久层等。收到请求后,验证服务从持久层请求数据。该解决方案的优点在于架构清晰,而缺点是架构修改比较费劲,整个服务的验证逻辑层都需要重写,工作量相对较大。而且由于依赖于持久层的数据库或者问题系统,会有单点风险,如果持久层失败,整个认证体系都会挂掉。

如何使用JWT来实现跨域身份认证呢?

  • JWT的特征和结构
    Header——头部

    例如:
    {
      "alg": "HS256",//这个表示加密的算法,算法可以自由选择一共有九种,可查询官网
      "typ": "JWT"//标识,可选
    }
    这部分定义好后需要Base64Url进行编码
    

    Payload——有效载荷

The second part of the token is the payload, which contains the
claims. Claims are statements about an entity (typically, the user)
and additional data. There are three types of claims: registered,
public, and private claims.

这部分是啥呢?其实这部分包含了claims,这个东西其实就像相当于响应体/请求体一样,里面包含了用户实体和附加信息数据。例如:用户的角色名,签证时间,过期时间,密钥id等等。

{
  "sub": "1234567890",//一个标识,可选内容自定
  "name": "John Doe",//用户名
  "admin": true//是否是管理员角色
}
这部分内容可自定义根据实际情况来
这部分内容定义好后也需要Base64Url进行编码

Signature——签名

To create the signature part you have to take the encoded header, the
encoded payload, a secret, the algorithm specified in the header, and
sign that. For example if you want to use the HMAC SHA256 algorithm,
the signature will be created in the following way:

该部分创建包含了头部编码和payload编码和一个密钥,密钥的算法定义在头部。

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

将三部分放在一起,经过Base64Url编码后的一串字符串格式如下:
在这里插入图片描述
三部分分别由“.”隔开,代表了头部,有效载荷,密钥。
以上就是jwt大概的一个结构。

JWT在项目中的使用

在项目中使用之前还需要明白两个概念:

  • 有状态登陆
    有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值