diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md index c5b3467acbba4de6284ff3b93cf4cdbf02ff7a93..68bc353c4032c38c75aec921a729102b50b58ebb 100644 --- a/docs/system-design/authority-certification/basis-of-authority-certification.md +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -1,25 +1,86 @@ -### 1 区分认证 (Authentication) 和授权 (Authorization) +## 1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 -**Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 +说简单点就是: -**Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 +- **认证 (Authentication):** 你是谁。 +- **授权 (Authorization):** 你有权限干什么。 + +稍微正式点(啰嗦点)的说法就是: + +- **Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 +- **Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 -### 2 Cookie的作用是什么?和Session有什么区别? +## 2. 什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ? + +### 2.1 什么是Cookie ? Cookie的作用是什么? Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 - **Cookie 一般用来保存用户信息**。下面是 Cookie 的一些应用案例: +维基百科是这样定义 Cookie 的:Cookies是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。简单来说: **Cookie 存放在客户端,一般用来保存用户信息**。 + +下面是 Cookie 的一些应用案例: + +1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。 +2. 使用Cookie 保存 session 或者 token ,向后端发送请求的时候带上 Cookie,这样后端就能取到session或者token了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。 +3. Cookie 还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为HTTP协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie + +### 2.2 如何能在 服务端使用 Cookie 呢? + +这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot,更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。 + +**1)设置cookie返回给客户端** + +```java +@GetMapping("/change-username") +public String setCookie(HttpServletResponse response) { + // 创建一个 cookie + Cookie cookie = new Cookie("username", "Jovan"); + //设置 cookie过期时间 + cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days + //添加到 response 中 + response.addCookie(cookie); + + return "Username is changed!"; +} +``` + +**2) 使用Spring框架提供的`@CookieValue`注解获取特定的 cookie的值** -1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了; -2. 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写); -3. 登录一次网站后访问网站其他页面不需要重新登录。 +```java +@GetMapping("/") +public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) { + return "Hey! My username is " + username; +} +``` + +**3) 读取所有的 Cookie 值** + +```java +@GetMapping("/all-cookies") +public String readAllCookies(HttpServletRequest request) { + + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + return Arrays.stream(cookies) + .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", ")); + } + + return "No cookies"; +} +``` + +## 3. Cookie 和 Session 有什么区别?如何使用Session进行身份验证? **Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 +**Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。** + +**那么,如何使用Session进行身份验证?** + 很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下: ![Session Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Session-Based-Authentication-flow.png) @@ -36,9 +97,7 @@ Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但 - [Guide to Spring Session](https://www.baeldung.com/spring-session) - [Sticky Sessions with Spring Session & Redis](https://medium.com/@gvnix/sticky-sessions-with-spring-session-redis-bdc6f7438cc3) -Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 - -### 3 什么是 Token?什么是 JWT? +## 4. 什么是 Token?什么是 JWT?如何基于Token进行身份验证? 我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 @@ -73,8 +132,4 @@ JWT 由 3 部分构成: - [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) - [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) -### 4 Session vs Token - - - -### 10.5 什么是OAuth 2.0 \ No newline at end of file +## 5 什么是OAuth 2.0 \ No newline at end of file