前后端身份认证:session身份认证,JWT认证

前后端身份认证

1、概述

  • 什么是身份认证
    身份认证(Authentication)又称“鉴权”,是指通过一定的手段,完成对用户身份的确认。

生活中常见的身份认证有:高铁的验票乘车、手机密码或指纹解锁,支付宝或微信的支付密码验证等。


而在Web开发中,涉及到用户身份的认证,例如:各大网站的手机验证码登录、邮箱密码登录,二维码登录等。

  • 为什么要身份认证
    HTTP是一种无状态的协议,为了分辨链接是谁发起的,需要浏览器自己去解决这个问题。有些情况下即使是打开同一个网站的不同页面也都要重新登录,很麻烦,Cookie、Session和Token就是为了解决这个问题而提出来的两个机制。

2、不同开发模式下的身份认证

对于服务器端渲染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案。
(1)服务器端渲染推荐使用Session认证机制
(2)前后端分离推荐使用JWT认证机制

3、关于HTTP协议的无状态性

在了解认证机制之前,我们先弄清一下什么是HTTP协议的无状态性,HTTP协议的无状态性指的是客户端每次的HTTP请求都是独立的连续多个请求之间没有直接的关系服务器不会主动保留每次HTTP请求的状态

4、Cookie

4.1 介绍

Cookie是存储在用户浏览器中的一段不超过4kb的字符串。它由一个名称(Name)、一个值(Value)其他几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。简单来说,cookie存储了某些数据信息,用于验证登录或者某一会话信息的数据。

我们打开浏览器,按下键盘F12键,随便打开一个网页,查看application选项,再选择cookie进行查看,如下
在这里插入图片描述

4.2 cookie特点

不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器进行身份认证

  • 总结
    (1)自动发送
    (2)域名独立
    (3)可以设置过期时限
    (4)每个cookie的长度限制为4kb
    (5)浏览器对每个域名下的cookie数量有限制

4.3 cookie分类

Session Cookie(会话cookie):打开浏览器访问某个网站时,会将cookie保存在电脑内存中,之后这个网站就不需要每个页面进行登录操作,但当网站关闭或者浏览器关闭时,那么内存中的cookie会被清空,之后打开这个网站就需要重新登陆了。

Permenent Cookie(永久cookie):cookie保存在电脑硬盘中,相当于永久保存,浏览器关闭或网站关闭时不会进行清除。

4.4 Cookie在session身份认证中的作用

客户端第一次请求服务器的时候,服务器通过响应头的形式向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie通过请求头的形式发送给服务器,服务器即可验证客户端的身份。

4.5 Cookie不具有安全性

cookie是存储在浏览器中的,而且浏览器也提供了读写cookie的API,因此Cookie很容易被伪造(CSRF攻击),不具有安全性,所以不建议服务器将重要的隐私数据(例如用户的身份信息、密码等)通过cookie的形式发给浏览器。

怎么保证cookie的安全性?
(1)设置过期时间,这样别人拿到的可能会是过期的cookie
(2)cookie进行加密
(3)不在cookie中存放敏感数据

5、Session认证

5.1 Session认证过程

1、浏览器进行登录操作,将用户名、密码等信息传到后端服务器。

2、服务器拿登录信息后到用户表中对比是否一致,判断用户是否存在,如果用户存在,则认证通过,生成session_id后端会话当中的一个键,表中的一个key值),并将session_id默认保存在会话表,当这条数据记录完之后,会将session_key(由服务器随机生成的加密密钥)和session_id相关联,并一起存放到响应头的set-cookie字段中,发给浏览器。【关于session_keysession_id1

3、浏览器将响应头中的set-cookie字段中的session_id取出来放到当前域名下的cookie中。

4、等到下次请求后端接口的时候,浏览器会自动将cookie中的session_id传给后端,后端拿获取到的session_id和会话表做对比,如果有一致的则请求成功,否则失败,如果session_id超时,也会失败。

5、请求成功后,服务器将当前用户对应的页面内容响应给浏览器。

5.2 Session认证原理图

在这里插入图片描述

5.3 Session认证的局限性

Session认证机制需要配合Cookie才能实现。并且由于Cookie默认并不支持跨域访问,涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域Session认证。

那我们什么情况下使用Session身份认证机制呢?就是当前端请求后端接口不存在跨域问题的时候用。

当前端确实需要进行跨域请求后端接口的时候,推荐使用JWT认证机制

6、JWT认证机制

6.1 JWT的工作原理图

在这里插入图片描述

简单来说就是用户的信息被加密,转换成token字符串的形式,保存在客户端浏览器中;服务器通过还原token字符串来获取用户信息

6.2 JWT的组成部分

JWT由三个部分组成,从前到后分别是Header,Payload,Signature。

Header.Payload.Signature
  • HeaderSignature安全性相关的部分,只是为了保证Token的安全。
  • Payload部分是用户信息经过加密之后生成的字符串,这部分才是真正的用户信息

6.3 JWT的使用方式

客户端收到服务器返回的JWT之后,通常会将它存储到localStorage(本地存储)或者sessionStorage(会话存储)中,当然cookie也行。

此后,客户端每次与服务器通信,都要带上这个JWT字符串,从而进行身份认证。

推荐的做法是将JWT放在HTTP请求头的Authoriazation字段中,这个返回jwt由Bearer这个字符串和token字符串拼接完成,中间空格分开,例如:

Authorization:
Bearer <token>

  1. session_id是指会话标识符,在Web应用程序中用于标识用户会话,并将用户的请求与正确的会话相匹配。session_id通常是一个字符串,会在用户第一次访问应用程序时自动创建,并在用户会话期间持续存储。每个session_id都应该是唯一的,以确保能够准确地区分每个用户会话,并正确地保存用户数据。
    session_key是指用于加密和解密会话数据的对称密钥。它通常是由服务器随机生成,并在建立会话时共享给客户端。session_key的目的是确保在用户会话期间,所有传输的数据都是加密的,并且只能由具有正确session_key的第一方(即应用程序服务器)和第二方(即用户浏览器或设备)进行解密。
    因此,可以将session_key看作是session_id的一个属性,用于确保会话数据的安全性和完整性。在用户验证结束后,服务器会将通过该session_id唯一标识的会话与相应的session_key相关联,从而确保会话数据的安全性。 ↩︎

猜你喜欢

转载自blog.csdn.net/lalala_dxf/article/details/126920162
今日推荐