# 身份认证的由来

平时我们在网页上进行交互时,例如登入自己的账号进行信息修改,往往需要服务器对我们进行身份的辨别,好让服务器能够拿到专属于我们自己账号的数据并返回给我们。由于 http 协议是无状态的,它并不会对会话进行控制。任何一个 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 默认不支持 跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 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 就一直生效前后端分离架构、跨域认证