JWT Security Session

1.什么是JWT?

        JWT最常见的场景就是授权认证,一旦认证用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后在进行处理。

           JWT是一种紧凑且自包含的,用于多方传递JSON对象的技术。传递的数据可以使数据签名增加其安全性。可以使用HMAC加密算法或RSA公钥/私钥加密方式

jwt有何作用?

JWT最常见的场景就是授权认证,一旦用户登录后,后续每个请求都将包含JWT,系统在每次处理用户请求的之前,都要先进行JWT安全效验,通过之后在进行处理.

JWT组成

JWT由3部分组成,用.(点)拼接

这三部分分别是头:

  • Header 头信息
    {
    'typ':'JWT',
    'alg':'HS256'
    }
  • Payload   有效载荷,自包含,记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高代码性能,记录铭文记录
    {
    
    "sub":'1234567890',
    "name":'john',
    "admin":true
    
    }
  • Signature
  • 签名信息。这是一个有开发者提供的信息。是服务器验证的传递数据是否有效安全的标准。在生成JWT最终数据之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head加密后的payload.在使用相同的加密算法,对加密后的数据和签名信息进行加密,得到最终结果
var encodedString=base64urlEncode(header)+"."+
base64urlEncode(payload);

var signature=HMACSHA256(encodedString,'secret');

执行流程:

添加依赖:

 

 单点登录:

 首先我们要明白单点登陆是什么

  我的理解就是多系统,单一位置登录,实现多系统同时登陆的一种技术。

目前互联网技术和技术平台中应用常出现,如:京东.。

单点登录一般是用于互相授信的系统,实现单一味位置登录,全系统有效的

其中还有三方登录:

          某系统,使用其他系统的用户,实现本系统登录的方式。如在京东中使用微信登录。解决信息孤岛和用户不对等的实现方案

一. Session跨域:

       所谓Session跨域就是摒弃了系统提供的Session,而使用自定义类似的Session的机制来保护客户端数据的一种解决方案

 如:通过设置cookie的domain来实现cookie的跨域传递。在cookie中传递一个自定义的session_id。这个session_id是客户端的唯一标记。将这个作为key,将客户端需要保存的数据作为value,在服务端进行保存(数据库)。这种机制就是Session的跨域解决。

         什么跨域,客户端请求的时候,请求的服务器,不是同一个IP,端口,域名,主机名的时候,都称为跨域。

        什么是域,在应用模型中,一个完整的,有独立访问路径的功能集合称为一个域。如:百度成为一个应用或系统。百度下有若干的域,如,搜索引擎(www.baidu.com),百度贴吧(tie.baidu.com),百度地图(map.baidu.com)等。域信息有时也称为多级域名。

        域的划分:以IP,端口,域名,主机名为标准,实现划分。

二:Spring Session共享 

       spring-session技术是spring提供的用于处理会话共享的解决方案。spring-session技术时将用户session数据保存到三方存储器中,如MySQL,redis等。

        spring-session技术是解决同域名下的多服务级群session共享问题的。不能解决跨域session共享问题。

基于JWT机制的单点登录

        使用JWT实现单点登陆时,需要注意token时效性。token是保存在客户端的令牌数据,如果永久有效,则有被劫持的可能。token在设计的是偶,可以考虑一次性有效或一段时间内有效。如果设置有效时长,则需要考虑是否需要刷新token有效其问题

        token保存位置

         使用JWT技术生成的token,客户端在保存的时候可以考虑cookie或localStorage。cookie保存方式,可以实现跨域传递数据。localStorage是域私有的本地存储,无法实现跨域。

HttpSession登陆方式:

        当客户端第一次在页面登录时,服务器会创建一个会话对象sessiion;然后通过Cookie实现记住用户名和密码,登录成功时把登录成功的user对象保存到Session对象里面,同时会把Session的id以Cookie的形式发给客户端,客户端之后会发出的每次请求都会带着Session的id,服务器接收到请求后会通过此id找到曾经创建的Session对象,此时通过判断Session里面是否有user对象就能够知道此客户端是否登陆过

Spring Secury单点登录流程:

在开发实践中每用户密码必须进行加密之后,在存储到数据库中

用的原始密码通常被称为明文或原文,加密之后的得到的结果被称为密文;

在处理加密是 通常采用消息摘要算法,该算法是不可逆算法,是蛇和对密码进行加密的

消息摘要算法MD系列:

加密算法: 加密过去返回来时还需解密,这是加密的特征(放的一般是内部人员),保障传输过程的安全

盐(没有具体要求,随便字符串)会和用户的实际密码拼接,是被运算数变得更加复杂

UUID:

全球唯一码,保证在同一时空内部会有相同的数据,他的运算过程中也用到的纳秒级的时间同时还有芯片的ID

应用场景:当我们需要非常随机的数字时可以用到他是16位进制数;

当我们需要注册时,如果必须登录后才能注册这是非常不合理的,要想在界面实现注册登录,我们需要设置一个白名单,白名单在Security配置类里面继承webSecurityContfigurerAdapter .

在登录界面登入用户名和密码时,Secuirty会拿到输入的用户名和密码,他就会去调用UserDatailService的接口类型;这个接口里面有一个方法,这个方法是Security是要自动调用的方法UserDetails loadByUsername((本身带有的参数)String username);输入用户名后会被直接调用这个方法,然后会拿到一个返回结果,此类型里包含密文密码;他会通过PasswordEncoder加密进行对比密码

同户:

通过mapper判断用户名是否存在,返回userDetails

密码的验证:

Security他把用户给定的密码(会转换成密文,最比较时会将盐值给取出来)调用PasswordEncoder 与UserDetails里面返回的密码去作匹配,

期间通过补充日志,便于我们观察程序的执行过程

在项目中使用JWt时,通常是登陆成功之后,生成JWT,且把它相应到客户端,客户端拿到JWT时,下去机会根据token来识别从而完成登录

在当客户端发起请求时,会走到controller接收到请求,走到业务层开始处理登录的业务,在业务层执行完认证后走到UserDetailsServiceImpl,在里面根据用户名去查询用户的详情,这是Spring Security框架自己去做的事情,然后再根据数据库做查询,spring Security返回给userDetails,进行判断密码进行登录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liamlf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值