文档

java体系技术文档


权限认证

<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>

页面列表

ITEM_HTML