认证和授权的区别是什么?

  • 认证 (Authentication): 你是谁。
  • 授权 (Authorization): 你有权限干什么。

RBAC 模型与 ABAC 模型

用户权限系统设计详解 —— 转转的用户权限系统设计。

很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:

  1. 用户成功登陆系统,然后返回给客户端具有 SessionIDCookie
  2. 当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。

使用 Session 的时候需要注意下面几个点:

  • 依赖 Session 的关键业务一定要确保客户端开启了 Cookie
  • 注意 Session 的过期时间。

另外,Spring Session 提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章:

Session-Cookie 方案在单体环境是一个非常好的身份认证方案。但是,当服务器水平拓展成多节点时,Session-Cookie 方案就要面临挑战了。Nginx 请求转发到不同的节点上。

  1. 将用户所有请求 Hash 到同一个服务器处理。若该服务器挂掉,那么 seesion 都消失了,没有备份机制。
  2. 每个服务器保存全量 session 信息。存储成本高,同步成本高。
  3. 通过 Redis 等服务来存储 session 信息。
  4. Spring Session 是一个用于在多个服务器之间管理会话的项目。它可以与多种后端存储(如 Redis、MongoDB 等)集成,从而实现分布式会话管理。通过 Spring Session,可以将会话数据存储在共享的外部存储中,以实现跨服务器的会话同步和共享。

这是一道经典的面试题!

一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID 的方案的话,如果客户端禁用了 Cookie,那么 Session 就无法正常工作。

但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将 SessionID 放在请求的 url 里面 https://javaguide.cn/?Session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了安全你也可以对 SessionID 进行一次加密之后再传入后端。

CSRF(Cross Site Request Forgery) 一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?说简单点,就是用你的身份去发送一些对你不友好的请求。

CSRF 进行请求伪造的时候,认证登陆后,请求会自动携带 Cookie,而 Cookie 中存储了认证相关的信息,从而无法防止 CSRF。

使用 Token 的时候,Token 一般存储在 localStorage (浏览器本地存储)中。在发送请求的时候,这个并不是自动携带的,而是由前端处理逻辑中携带 Token 的。因此无法提供认证信息。

需要注意的是:不论是 Cookie 还是 Token 都无法避免 跨站脚本攻击(Cross Site Scripting)XSS

推荐阅读:如何防止 CSRF 攻击?—美团技术团队

JWT

什么是 JWT? JWT 由哪些部分组成?

JWT 基础概念详解

如何基于 JWT 进行身份验证? 如何防止 JWT 被篡改?

JWT 身份认证优缺点分析

SSO

什么是 SSO?

SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东国际、京东生鲜等子系统。

SSO 有什么好处?

  • 用户角度 :用户能够做到一次登录多次使用,无需记录多套用户名和密码,省心。
  • 系统管理员角度 : 管理员只需维护好一个统一的账号中心就可以了,方便。
  • 新系统开发角度: 新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时。

如何设计实现一个 SSO 系统?

SSO 单点登录详解

OAuth 2.0

OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而 OAuth 2.0 是对 OAuth 1.0 的完全重新设计,OAuth 2.0 更快,更容易实现,OAuth 1.0 已经被废弃。详情请见:rfc6749

实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 Token,使得第三方应用能够通过该令牌获取相关的资源。

OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

下图是 Slack OAuth 2.0 第三方登录 的示意图:

|600

推荐阅读:

参考