目录
1.概述
2.会话技术
3.JWT令牌
1.概述
基础的登录功能实际上就是查询数据库中有没有输入的用户和密码,有就放行,没有就返回错误信息,根据三层架构进行开发:
controller层:
service层:
mapper层:
以上完成了基础的登录功能。此时通过路径访问,依然可以不输入用户信息而直接进入到系统中,下面添加登录校验功能,以保证必须登录才能访问。
登录校验:
登录校验,也称为身份验证(Authentication),是确认用户身份的过程。在计算机系统、网络或应用程序中,登录校验是一个关键的安全步骤,用于确保只有经过授权的用户才能访问受限资源。简单来说,就是只有用户登录了,才能进增删改查等操作。
我们在用户登录后建立一个登录标记,再利用拦截器拦截浏览器发送的请求,拦截器去判断是否有登陆标记,有就正常放行请求,没有就给浏览器返回错误信息。这样我们就构建了登录校验的功能。登录标记使用会话技术,统一拦截有两种,1.servlet中的过滤器filter。2.spring的拦截器interceptor
2.会话技术
会话技术(Session Technology)是Web应用程序用来识别和管理用户会话的一种机制。会话技术允许服务器在无状态的HTTP协议下跟踪用户的活动和状态。浏览器和服务器间的一次链接就称为一次会话。
简单来说,用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。比如验证码,发送请求获取验证码图片,输入验证码登录又发送了一次请求。这两次请求之间就需要进行验证码值的对比,此时就要共享数据。
会话跟踪技术方案:1.客户端会话跟踪技术: Cookie 2.服务端会话跟踪技术: Session 3.令牌技术
Cookie:浏览器第一次登录时,服务端将生成一个cookie用于存储一些用户的数据信息,比如id。再将这个cookie返回给浏览器,浏览器本地存储这个cookie,这样每次浏览器发送请求都携带这个cookie给服务器,服务器有这个cookie值,就给浏览器请求放行,这样就完成了不同请求间的数据共享。
Tomcat也有cookie的api,可以方便的设置和获取cookie:
浏览器第一次请求后,服务端返回的cookie的值
在浏览器storage中存储了这个cookie,
再次请求服务端,将在请求头中携带这个cookie
cookie的优点是http协议支持cookie技术,一切动作都是浏览器自动进行的。
缺点是1.移动端无法使用cookie。2.cookie存储在用户本地,不安全而且用户可以禁用cookie。3.cookie不能跨域( 协议/IP/端口这三个维度有一个维度不同就是跨域操作)
例如在前后端分离的开发中,前后端部署在不同的服务器上,如果域名不同,登录时访问的前端登录页面,进入后却要访问后端,此时cookie就无法使用了。
session:实际上也是基于cookie实现的。不同的是Session值将存储在服务器端,服务器通过Session ID来识别和管理不同用户的Session。其他流程和cookie一致,服务端发送cookie,这个cookie中包含sessionID,每次请求浏览器都携带这个sessionID,由服务端判断ID是否存在,存在则放行。
Session的优点是值存储在服务端,即使cookie被他人恶意劫持修改了,ID不通过依然不会放行,因此比较安全。
缺点是1.服务器集群环境下无法直接使用session,因为请求访问的后端服务器可能不一样,a服务器存储了ID,但b服务器没有,那么就会被b服务器判断为第一次访问。2.由于基于cookie,因此也有cookie的部分缺点。
现在的企业基本都是用集群服务器,而以上两种方案存在许多问题,由此引入第三种方案:令牌技术,也是如今常用的用于登录认证的技术。
3.JWT令牌
JSON Web Tokens (JWT)定义了一种简洁的、 自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。 官网:JSON Web Tokens - jwt.io
它是一种无状态的认证机制,它允许服务端生成一个包含用户信息和签名的Token,客户端在每次请求时携带这个Token,服务端通过验证Token的签名来确认用户的身份和权限。JWT的流程大致为:用户登录 → 获取Token → 携带Token请求资源 → 服务端验证Token并返回数据
简洁的:jwt令牌实际上就是一串字符串。自包含:看似随机的字符串中可以存储自定义信息
其组成如下:
JWT的生成和校验:
引入依赖
jwts工具类用于生成和校验
令牌一旦生成,篡改其任何一位都将无法通过校验,并且令牌存在有效期,过了有效期令牌就无法使用了。因此令牌是安全可靠的,避免了cookie可伪造等缺点。
登录后下发令牌:
以上就完成了在不同的请求之间数据的共享,通过判断浏览器发送的请求是否携带合法的jwt令牌。如何统一拦截请求并判断令牌合法放在下篇(filter/interceptor)