这是我参与「第四届青训营 」笔记创作活动的第5天
一、Session 认证机制
来源
什么是HTTP协议的无状态性 ?
为了知道Seesion为何诞生,首先我们需要来了解一下HTTP协议的无状态性
HTTP协议的无状态性,指的是客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次HTTP请求的状态。所以我们每次请求都不会保留记录,因此http诞生了一个叫cookie的东西。
什么是Cookie ?
Cookie是存储在用户浏览器中的一段不超过4 KB的字符串。它由一个名称(Name)、一个值(Value) 和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie 一同发送到服务器。
一些常见的cookie
Cookie在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将Cookie保存在浏览器中。
随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
现在我们知道了cookie在前后端交互的意义了,但是cookie其实十分不安全,由于cookie容易被获取,所以我们一下重要信息显然不能简单的用cookie来存储。这时我们就需要cookie + 身份验证的方法诞生了——session。
Session的工作原理
在登陆注册时,客户端会先将密码和账号发给服务端server,sever会验证密码和账号,并返回一个session_id给client,并且server也会把这个session_id存在数据库中,当client再次发送请求时,会携带该域名下的所有cookie给server,如果其中有用户的信息的session_id,server会拿取这个session_id到数据库查找对应的用户名和密码,如果与client的用户名密码一致,server才能验证成功身份返回对应的内容。
注意:session_id一般存储在cookie中,但是由于JS不让访问这种cookie,因此对于跨域的请求就无法完成了。
二、JWT 认证机制
来源
Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。
当前端请求后端接口**不存在跨域问题**的时候,**推荐使用 Session** 身份认证机制。
当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。
JWT的工作原理
首先client会发送用户名和密码给server,server会根据自己服务器内的secret密钥 + client的用户名和密码,通过哈希加密算法,生成一段JWT字符串,并且把这段字符串放回给client。此时这段JWT字符串server是不需要保存在数据库或这服务端的。那server是如何验证的呢?在下一次client提交用户名密码时会携带上之前生成的JWT字符串,server只需要在次通过哈希加密算法,来生成一段新的JWT字符串,在将这段新的字符串与client发回来的JWT字符串进行比对,如果一致的话,则验证成功。
这个哈希加密算法,在有secret密钥和用户名信息后,可以在很短时间内算出来JWT字符串,而如果只知道JWT字符串和用户名信息,则很难在有限的时间内算出来secret密钥,基本无法推出来。
所以我们会给JWT字符串定义一个限期,保证足够的安全性。
JWT的组成部分
JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。
三者之间使用英文的“.”分隔,格式如下:
例子:
JWT 的三个组成部分,从前到后分别是 Header、Payload、Signature。
其中:
Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。