面试_认证授权
基本知识
认证和授权的区别
- 认证 (Authentication): 你是谁。
- 授权 (Authorization): 你有权限干什么。
稍微正式点(啰嗦点)的说法就是:
- Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
- Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。
Cookie
Cookies
是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。
有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中如果包含Set-Cookie这个头部时,意思就是指示客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期。如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另外一种情况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。一个cookie的设置以及发送过程分为以下四步:
简单来说:**Cookie
存放在客户端,一般用来保存用户信息**。
下面是 Cookie
的一些应用案例:
- 我们在
Cookie
中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie
还能保存用户首选项,主题和其他设置信息。 - 使用
Cookie
保存SessionId
或者Token
,向后端发送请求的时候带上Cookie
,这样后端就能取到Session
或者Token
了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。 Cookie
还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为 HTTP 协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie
- ……
Session
Cookie 和 Session 有什么区别?
Session
的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的Session
之后就可以标识这个用户并且跟踪这个用户了。Cookie
数据保存在客户端(浏览器端),Session
数据保存在服务器端。相对来说Session
安全性更高。如果使用Cookie
的一些敏感信息不要写入Cookie
中,最好能将Cookie
信息加密然后使用到的时候再去服务器端解密。cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
如果没有 Cookie 的话 Session 还能用吗?
这是一道经典的面试题!
一般是通过 Cookie
来保存 SessionID
,假如你使用了 Cookie
保存 SessionID
的方案的话, 如果客户端禁用了 Cookie
,那么 Session
就无法正常工作。
但是,并不是没有 Cookie
之后就不能用 Session
了,比如你可以将 SessionID
放在请求的 url
里面https://javaguide.cn/?Session_id=xxx
。这种方案的话可行,但是安全性和用户体验感降低。当然,为了安全你也可以对 SessionID
进行一次加密之后再传入后端。
什么是 JWT?
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。
JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
可以看出,JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。
并且, 使用 JWT 认证可以有效避免 CSRF 攻击,因为 JWT 一般是存在在 localStorage 中,使用 JWT 进行身份验证的过程中是不会涉及到 Cookie 的。
JWT 由哪些部分组成?
JWT 本质上就是一组字串,通过(.
)切分成三个为 Base64 编码的部分:
- Header : 描述 JWT 的元数据,定义了生成签名的算法以及
Token
的类型。 - Payload : 用来存放实际需要传递的数据
- Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。
单点登录
什么是 SSO?
SSO 英文全称 Single Sign On,单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
例如你登录网易账号中心(https://reg.163.com/open in new window )之后访问以下站点都是登录状态。
- 网易直播 https://v.163.comopen in new window
- 网易博客 https://blog.163.comopen in new window
- 网易花田 https://love.163.comopen in new window
- 网易考拉 https://www.kaola.comopen in new window
- 网易 Lofter http://www.lofter.com
SSO 有什么好处?
- 用户角度 :用户能够做到一次登录多次使用,无需记录多套用户名和密码,省心。
- 系统管理员角度 : 管理员只需维护好一个统一的账号中心就可以了,方便。
- 新系统开发角度: 新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时
如何实现
采用Redis + JWT
实现基于 Redis 和 Token 的单点登录(SSO)系统,通常涉及几个关键步骤:
- 生成 Token:当用户首次登录成功后,系统生成一个唯一的 Token 并返回给用户。
- 存储 Token:Token 通常会与用户的身份信息(如用户ID)一起存储在 Redis 中,并设置一个过期时间。
- 验证 Token:每次用户请求需要身份验证的资源时,都会携带 Token。服务器从请求中提取 Token,并在 Redis 中验证其有效性。
- 注销登录:当用户注销时,需要从 Redis 中删除对应的 Token。
如何要实现一次登录,多个站点都可以登录。只需要使用拦截器进行拦截,并且每次请求都发送Token