文章目录
- 前后端身份认证
- 1、概述
- 2、不同开发模式下的身份认证
- 3、关于HTTP协议的无状态性
- 4、Cookie
- 4.1 介绍
- 4.2 cookie特点
- 4.3 cookie分类
- 4.4 Cookie在session身份认证中的作用
- 4.5 Cookie不具有安全性
- 5、Session认证
- 5.1 Session认证过程
- 5.2 Session认证原理图
- 5.3 Session认证的局限性
- 6、JWT认证机制
- 6.1 JWT的工作原理图
- 6.2 JWT的组成部分
- 6.3 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_key
和session_id
1】
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
Header
和Signature
是安全性相关的部分,只是为了保证Token的安全。Payload
部分是用户信息经过加密之后生成的字符串,这部分才是真正的用户信息
6.3 JWT的使用方式
客户端收到服务器返回的JWT之后,通常会将它存储到localStorage(本地存储)或者sessionStorage(会话存储)中,当然cookie也行。
此后,客户端每次与服务器通信,都要带上这个JWT字符串,从而进行身份认证。
推荐的做法是将JWT放在HTTP请求头的Authoriazation字段中,这个返回jwt由Bearer这个字符串和token字符串拼接完成,中间空格分开,例如:
Authorization:
Bearer <token>
session_id是指会话标识符,在Web应用程序中用于标识用户会话,并将用户的请求与正确的会话相匹配。session_id通常是一个字符串,会在用户第一次访问应用程序时自动创建,并在用户会话期间持续存储。每个session_id都应该是唯一的,以确保能够准确地区分每个用户会话,并正确地保存用户数据。
session_key是指用于加密和解密会话数据的对称密钥。它通常是由服务器随机生成,并在建立会话时共享给客户端。session_key的目的是确保在用户会话期间,所有传输的数据都是加密的,并且只能由具有正确session_key的第一方(即应用程序服务器)和第二方(即用户浏览器或设备)进行解密。
因此,可以将session_key看作是session_id的一个属性,用于确保会话数据的安全性和完整性。在用户验证结束后,服务器会将通过该session_id唯一标识的会话与相应的session_key相关联,从而确保会话数据的安全性。 ↩︎