基于token与Session身份认证对比

 一、什么是身份认证

        身份认证分认证和授权俩步,那么具体什么是认证,什么是授权呢?简单来说认证就是让服务器知道你是谁授权就是让服务器知道你能干什么,不能干什么?那么基于身份认证我们一般有俩种方式:Session-Cookie和JWT。

二、认证流程

  基于Session的认证流程

  1. 用户在浏览器输入用户名和密码请求服务器,服务器收到请求后进行密码校验,校验通过之后生成一个session保存到数据库,另外需要将对应的sessionId返回给客户端
  2. 浏览器拿到服务器返回的sessionId后,将sessionId放置浏览器cookie中,在后续的请求中都带这个cookie信息进行访问。
  3. 服务器收到请求后,获取cookie,通过获取cookie中的sessionId查找数据库判断当前请求是否有效。

基于JWT的认证流程

  1. 用户在浏览器输入用户名和密码请求服务器,服务器收到请求后进行密码校验,校验通过之后生成一个token并保存到数据库,另外需要将这个token返回给前端
  2. 前端收到后端返回的token,将其存储到cookie或者local storage中,在后续的请求中将这个token放到Header中带着这个token信息进行访问。
  3. 服务器获取token值,通过查找数据判断当前的token是否有效。

认证流程区别

        对比发现基于JWT和Session的认证方式的主要区别是用户状态的保存位置,JWT是保存在客户端的(前端工程),而Session是保存在服务端(浏览器)的。

三、优缺点对比

        上面我了解了Session与JWT的认证流程,并清楚他们认证过程中的主要区别是用户状态的保存位置。基于其保存位置的不同我们可以分析得到如下:

Session的优缺点

优点:

  1. 简单性,可以主动清除session
  2. sessionId存在浏览器的Coookie中,较为灵活,兼容性较好
  3. Session保存在服务器,相对来说更安全。而JWT是使用base64编码的,可以解码出来是非常的不安全,比如用户的密码。因此在JWT中不能存在敏感数据。
  4. SessionId字符串短,通过Cookie携带发送。而JWT经过编码之后的是一个非常长的字符串,cookie的限制大小一般是4K,cookie很有可能放不下,所以JWT一般放在客户端的local storage里面。并且用户在系统中的每一次http请求请求都会把JWT携带在Header里面,HTTP请求的Header可能比Body还有大。因此Session请求比JWT的HTTP请求开销小

缺点:

  1. 基于 cookie 的机制很容易被 CSRF攻击
  2. 浏览器支持cookie,移动端无cookie致使无法使用session认证方案
  3. Session保存在服务器,分布式部署中需要做多机共享session机制

        

      Session 共享机制解决方案:通常解决方法为将session存储到数据库中或者redis中,但此种方式每次请求都需要去请求redis或数据库必然也会增加请求耗时和数据库或redis存储空间。

JWT的优缺点

优点:

  1.  JWT保存在客服端,适用于分布式环境(这点很适用于现在大多数的项目
  2.  可扩展性:不需要在服务端保存会话信息,易于应用的扩展
  3.  安全性:JWT使用数字签名或加密机制来验证令牌的真实性,防止伪造和篡改。此外,JWT不需要在服务器上存储会话信息,从而降低了被攻击的风险
  4. 跨平台兼容性:JWT是基于标准的JSON格式,可以在不同的平台和编程语言之间进行交互

缺点:

  1. 令牌过期问题:JWT的令牌过期时间是固定的,无法在令牌生成后更改。如果攻击者获取了有效的JWT令牌,他们可以在令牌过期之前一直使用该令牌
  2. 令牌大小问题:JWT令牌的大小通常比Session令牌大,因为它包含了更多的信息。这可能会导致网络传输速度变慢
  3. 无法撤销问题:一旦JWT令牌生成,就无法撤销。如果需要撤销令牌,必须等待令牌过期或更改密钥
  4. 安全性没法保证,所以JWT里不能存储敏感数据

四、JWT和Session的选择

        经过对比我们发现JWT与Session各有利弊,JWT最大的优势是在分布式中不需要做额外的工作,更加适用,最大的问题是令牌过期问题,无法主动让token失效。对应着Session的最大优势就是session存储在服务端,安全性较好,不担心被窃取,但是随着社会的发展进步现在越来越多的系统要求使用分布式,这样导致Session的使用率越来越低,虽然可以使用redis或数据库来解决session共享的问题,但与之也会带来耗时及内存的损耗。

        所以具体如何选择,还是要根据项目的实际情况对比俩者的利弊进行选择。

你可能感兴趣的:(Springboot多模块集成,spring,boot,后端,身份认证,JWT,Session)