File tree Expand file tree Collapse file tree 3 files changed +13
-13
lines changed
docs/system-design/security Expand file tree Collapse file tree 3 files changed +13
-13
lines changed Original file line number Diff line number Diff line change 55 - 安全
66---
77
8- ## Token 认证的优势
8+ ## JWT 的优势
99
1010 相比于 Session 认证的方式来说,使用 Token 进行身份认证主要有下面四个优势:
1111
12- ### 1. 无状态
12+ ### 无状态
1313
1414Token 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
1515
1616不过,也正是由于 Token 的无状态,也导致了它最大的缺点:当后端在Token 有效期内废弃一个 Token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。另外,当用户 Logout 的话,Token 也还有效。除非,我们在后端增加额外的处理逻辑比如将失效的 Token 存储起来,后端先验证 Token 是否有效再进行处理。
1717
18- ### 2. 有效避免了 CSRF 攻击
18+ ### 有效避免了 CSRF 攻击
1919
2020** CSRF(Cross Site Request Forgery)** 一般被翻译为 ** 跨站请求伪造** ,属于网络攻击领域范围。相比于 SQL 脚本注入、XSS 等安全攻击方式,CSRF 的知名度并没有它们高。但是,它的确是每个系统都要考虑的安全隐患,就连技术帝国 Google 的 Gmail 在早些年也被曝出过存在 CSRF 漏洞,这给 Gmail 的用户造成了很大的损失。
2121
@@ -64,19 +64,19 @@ public class XSSFilter implements Filter {
6464}
6565```
6666
67- ### 3. 适合移动端应用
67+ ### 适合移动端应用
6868
6969使用 Session 进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie(需要 Cookie 保存 ` SessionId ` ),所以不适合移动端。
7070
7171但是,使用 Token 进行身份认证就不会存在这种问题,因为只要 Token 可以被客户端存储就能够使用,而且 Token 还可以跨语言使用。
7272
73- ### 4. 单点登录友好
73+ ### 单点登录友好
7474
7575使用 Session 进行身份认证的话,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,并且还会遇到常见的 Cookie 跨域的问题。但是,使用 Token 进行认证的话, Token 被保存在客户端,不会存在这些问题。
7676
77- ## Token 认证常见问题以及解决办法
77+ ## JWT 身份认证常见问题及解决办法
7878
79- ### 1. 注销登录等场景下 Token 还有效
79+ ### 注销登录等场景下 Token 还有效
8080
8181与之类似的具体相关场景有:
8282
@@ -95,7 +95,7 @@ public class XSSFilter implements Filter {
9595
9696对于修改密码后 Token 还有效问题的解决还是比较容易的,说一种我觉得比较好的方式:** 使用用户的密码的哈希值对 Token 进行签名。因此,如果密码更改,则任何先前的令牌将自动无法验证。**
9797
98- ### 2. Token 的续签问题
98+ ### Token 的续签问题
9999
100100Token 有效期一般都建议设置的不太长,那么 Token 过期后如何认证,如何实现动态刷新 Token,避免用户经常需要重新登录?
101101
Original file line number Diff line number Diff line change @@ -131,7 +131,7 @@ public String readAllCookies(HttpServletRequest request) {
131131
132132很多时候我们都是通过 ` SessionID ` 来实现特定的用户,` SessionID ` 一般会选择存放在 Redis 中。举个例子:
133133
134- 1 . 用户成功登陆系统,然后返回给客户端具有 ` SessionID ` 的 ` Cookie `
134+ 1 . 用户成功登陆系统,然后返回给客户端具有 ` SessionID ` 的 ` Cookie ` 。
1351352 . 当用户向后端发起请求的时候会把 ` SessionID ` 带上,这样后端就知道你的身份状态了。
136136
137137关于这种认证方式更详细的过程如下:
@@ -146,8 +146,8 @@ public String readAllCookies(HttpServletRequest request) {
146146
147147使用 ` Session ` 的时候需要注意下面几个点:
148148
149- 1 . 依赖 ` Session ` 的关键业务一定要确保客户端开启了 ` Cookie ` 。
150- 2 . 注意 ` Session ` 的过期时间。
149+ - 依赖 ` Session ` 的关键业务一定要确保客户端开启了 ` Cookie ` 。
150+ - 注意 ` Session ` 的过期时间。
151151
152152另外,Spring Session 提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章:
153153
Original file line number Diff line number Diff line change @@ -121,7 +121,7 @@ HMACSHA256(
121121
122122算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(` . ` )分隔,成为 JWT 的第三部分。
123123
124- ## 如何基于 Token 进行身份验证?
124+ ## 如何基于 JWT 进行身份验证?
125125
126126在基于 Token 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 ` Secret ` (密钥)创建` Token ` (令牌)并将 ` Token ` 发送给客户端。客户端接收到 ` Token ` 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。
127127
@@ -141,7 +141,7 @@ HMACSHA256(
141141
142142** [ spring-security-jwt-guide] ( https://github.com/Snailclimb/spring-security-jwt-guide ) ** 就是一个基于 JWT 来做身份认证的简单案例,感兴趣的可以看看。
143143
144- ## JWT 是如何防止 Token 被篡改的 ?
144+ ## JWT 如何防止 Token 被篡改 ?
145145
146146有了签名之后,即使 Token 被泄露或者解惑,黑客也没办法同时篡改 Signature 、Header 、Payload。
147147
You can’t perform that action at this time.
0 commit comments