身份认证技术


身份认证的由来

平时我们在网页上进行交互时,例如登入自己的账号进行信息修改,往往需要服务器对我们进行身份的辨别,好让服务器能够拿到专属于我们自己账号的数据并返回给我们。由于http协议是无状态的,它并不会对会话进行控制。任何一个http请求对服务器来说都是独立的,毫不相干的请求。{% post_link ‘2021-10-28-http协议’ ‘http协议’%}的这种特性就导致了我们需要自己想办法对用户进行识别,于是便有了身份认证技术。

现在流行的身份认证认证手段主要有三种,分别是:cookie、session和 JWT。这三种身份认证技术都有各自的适用场景,所以在前端中均有大量使用。下面就让我们深入了解一下这三种技术

Cookie认证

首先我们要明确什么是cookie。cookie实际上就是一份服务器给浏览器客户端设置的文本信息。当用户第一次登录进系统时,服务器会给用户设置一个cookie,后续用户每次发送http请求中都会携带cookie用于身份识别。

cookie信息都携带在请求头中,而且一个cookie的大小一般不超过4KB。

请求头中的cookie

它的内容由名称、值和一些用于控制有效期、安全性、使用范围的可选属性组成。不同域名下的cookie时各自独立的,不能拿一个网站的cookie去另一个网站做身份认证。每当客户端发起请求时,会自动当前域名下所有未过期的 Cookie 一同发送到服务器。

我们可以在浏览器的设置中查看cookie的内容

某度的一个cookie

因为cookie认证是用户单方面认证,用户完全可以自己伪造一个cookie发送给服务器来欺骗服务器,这使得cookie安全性较低。为了解决cookie的这个缺陷,进一步提高系统的安全性,所以又有了session机制来辅助身份认证。

Session认证

session认证即是在服务器上设置一个标识用户的信息,当用户拿cookie来认证时,服务器这边根据cookie拿出相应的session来必对认证。若服务器这边没有对应的session则说明该cookie是伪造的,拒绝响应。

session认证原理

有了session就可以防止用户伪造cookie登录进系统。进一步提高了安全性。

Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持 {% post_link ‘2021-10-29-同源与跨域’ ‘跨域访问’ %},所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。

为了解决这个跨域问题,我们又升级了身份认证技术,采用JWT技术可以解决跨域认证的问题。

JWT

JWT(英文全称:JSON Web Token)是目前最流行跨域认证解决方案。针对跨域问题,JWT采用Token加密字符串来实现身份认证。用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用户的身份。

JWT工作原理

JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。

三者之间使用英文的“.”分隔,格式如下:

Header.Payload.Signature

其中:

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

Payload部分

客户端收到服务器返回的 JWT 之后,通常会将它储存在 localStorage 或 sessionStorage 中。

此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下:

Authorization: Bearer <token字符串>

三种认证技术的区别与特点

认证技术工作原理生命周期适用场景
cookie单向认证未设置expire属性的cookie关闭浏览器即失效服务器端渲染数据、同源认证
session双向认证服务器未清除即一直生效服务器端渲染数据、同源认证
JWT密钥认证服务器未更换secret就一直生效前后端分离架构、跨域认证