权限认证
<h2>1 认证(Authentication)和授权(Authorization)的区别是什么?</h2>
<p>简单来说:</p>
<ul>
<li>认证(Authentication):你是谁?</li>
<li>授权(Authorization):你有权限干什么?</li>
</ul>
<p>稍微正式的说法是:</p>
<ul>
<li>认证(Authentication):是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知
道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。</li>
<li>授权(Authorization): 发生在 认证(Authentication) 之后。它主要掌管我们访问系统的权限。比如有些特
定资源只能有特定权限的人才能访问,如admin。有些对系统资源操作比如删除、添加、更新只能特定人才具有。</li>
</ul>
<p>这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。</p>
<h2>2 什么是cookie?cookie的作用是什么?</h2>
<p>Cookies是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。简单来说: Cookie
存放在客户端,一般用来保存用户信息。</p>
<p>Cookie 的一些应用案例:</p>
<ol>
<li>我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给
填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。</li>
<li>使用Cookie 保存 session 或者 token ,向后端发送请求的时候带上 Cookie,这样后端就能取到session或
者token了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。</li>
<li>Cookie 可以用来记录和分析用户行为。例如你在网上购物的时候,因为HTTP协议是没有状态的,如果服务器
想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie</li>
</ol>
<h2>3 cookie和session的区别是什么?如何使用session进行身份认证?</h2>
<p>Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,
系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可
以标识这个用户并且跟踪这个用户了。</p>
<p>Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使
用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解
密。</p>
<p>很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:
用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID
带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下:</p>
<p><img src="https://s2.ax1x.com/2019/12/17/QIUcUx.png" alt="session认证" /></p>
<ol>
<li>用户向服务器发送用户名和密码用于登陆系统。</li>
<li>服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储 起来。</li>
<li>服务器向用户返回一个 SessionID,写入用户的 Cookie。</li>
<li>当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。</li>
<li>服务器可以将存储在 Cookie 上的 Session ID 与存储在内存中或者数据库中的 Session 信息进行比较,
以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。</li>
<li>响应数据给客户端。</li>
</ol>
<h2>4 如何基于token进行身份认证?</h2>
<p>在基于 Token 进行身份验证的的应用程序中,服务器通过Payload、Header和一个密钥(secret)创建令牌(Token)
并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请
求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP
Header 的 Authorization字段中: Authorization: Bearer Token。
<img src="https://s2.ax1x.com/2019/12/17/QIUsbR.png" alt="token认证" /></p>
<ol>
<li>用户向服务器发送用户名和密码用于登陆系统。</li>
<li>身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。</li>
<li>用户以后每次向后端发请求都在Header中带上 JWT。</li>
<li>服务端检查 JWT 并从中获取用户相关信息。</li>
<li>响应数据给客户端。</li>
</ol>