当前位置:网站首页>JSON Web Token----JWT和傳統session登錄認證對比
JSON Web Token----JWT和傳統session登錄認證對比
2022-07-04 05:55:00 【Rk..】
目錄
2.3、springboot的單體項目使用傳統session實現登錄和認證
3、Cookie-Session認證昇級版----redis實現session共享
1、什麼是JWT
JWT簡稱JSON Web Token,也就是通過JSON形式作為Web應用中的令牌,用於在各方之間安全地將信息作為JSON對象傳輸。在數據傳輸過程中還可以完成數據加密、簽名等相關處理。Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准。該token被設計為緊凑且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
單點登錄:
單點登錄的英文名叫做:Single Sign On(簡稱SSO)。在以前的時候,一般我們就單系統,所有的功能都在同一個系統上。後來,我們為了合理利用資源和降低耦合性,於是把單系統拆分成多個子系統。
比如阿裏系的淘寶和天猫,很明顯地我們可以知道這是兩個系統,但是你在使用的時候,登錄了天猫,淘寶也會自動登錄。簡單來說,單點登錄就是在多個系統中,用戶只需一次登錄,各個系統即可感知該用戶已經登錄。
2、傳統的Cookie-Session認證
2.1、登錄認證流程
1、客戶端向服務端發送賬號密碼進行認證。
2、服務端在校驗賬號密碼正確之後,將當前用戶的基本信息保存到當前會話(session)中,並將sessionid(JESSIONID)返回給客戶端。
3、客戶端在拿到sessionid之後將其保存到cookie中,並在以後的每次請求中cookie都攜帶該sessionid。sessionid相當於key,session相當於value,服務器通過sessionid來獲取session
4、服務端根據客戶端傳過來的sessionid對當前用戶進行認證,判斷是否合法。
2.2、缺點
1、Session: 每個用戶經過我們的應用認證之後,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大。
2、擴展性: 用戶認證之後,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。而且如果你後端應用是多節點部署。那麼就需要實現session共享機制。 不方便集群應用。
3、CSRF: 因為是基於cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊
4、Cookie-Session 只能在 web 場景下使用,如果是 APP 呢,APP 可沒有地方存 cookie。
現在的產品基本上都同時提供 web 端和 APP 兩種使用方式,有的產品甚至只有 APP
2.3、springboot的單體項目使用傳統session實現登錄和認證
登錄:
//登錄錶單發送請求
@PostMapping("/login")
public String login(User user, HttpSession session,Model model){
//省略從數據庫查詢
if("luo".equals(user.getUsername())&&"123456".equals(user.getPassword()))
{
session.setAttribute("loginUser",user);
return "redirect:/main.html";//重定向到main頁面
}else {
model.addAttribute("msg","賬號或密碼錯誤");
return "login";
}
}
登錄成功後會將sessionid返回給客戶端瀏覽器,存儲在cookie中。
攔截器:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登錄檢查邏輯 通過sessionid來獲取session
HttpSession session = request.getSession();
//獲取session中存儲的對象
Object loginUser = session.getAttribute("loginUser");
if(loginUser!=null)//如果不為空,說明已經有用戶登錄
return true;//登錄 放行
//攔截住,未登錄 跳轉到登錄頁面
request.setAttribute("msg","請先登錄!");
request.getRequestDispatcher("/login").forward(request,response);
return false;
}
每次前端發起請求後,都會先經過這個攔截器。通過前端攜帶sessionid,然後通過sessionid獲取對應的session。然後獲取session中存儲的對象
測試接口:
@ResponseBody
@GetMapping("/list")
public List<User> list(){
//查詢所有數據
List<User> list = userService.list();
return list;
}
如果沒有登錄請求其他接口會被攔截:例如list接口
登錄後再次訪問list接口:
先登錄:
登錄成功後會返回一個JESSIONID到cookie裏。
再次訪問list接口:
3、Cookie-Session認證昇級版----redis實現session共享
由於傳統的 Cookie-Session 認證存在諸多問題,那可以把上面的方案改造一下。
1、改造 Cookie 既然 Cookie 不能在 APP 等非瀏覽器中使用,那就不用 cookie 做客戶端存儲,改用其他方式。
web 中可以使用 local storage,APP 中使用客戶端數據庫,這樣既能這樣就實現了跨域,並且避免了 CSRF 。
2、服務端也不存 Session 了,把 Session 信息拿出來存到 Redis中,這樣即提高了速度,又避免了 Session 同步問題;
經過改造之後變成了如下的認證過程:
- 用戶輸入用戶名、密碼或者用短信驗證碼方式登錄系統;
- 服務端經過驗證,將認證信息構造好的數據結構存儲到 Redis 中,並將 key 值返回給客戶端;
- 客戶端拿到返回的 key,存儲到 local storage 或本地數據庫;
- 下次客戶端再次請求,把 key 值附加到 header 或者 請求體中;
- 服務端根據獲取的 key,到 Redis 中獲取認證信息;
下面兩張圖分別演示了首次登錄和非首次登錄的過程。
解决了傳統 Cookie-Session 方式存在的問題。這種改造需要開發者在項目中自行完成。改造起來肯定是費時費力的,而且還有可能存在漏洞。
4、基於JWT認證
4.1、認證流程
token中可以存儲用戶信息,不需要像session那樣將用戶信息存儲在服務器上,占用內存。
1、首先,前端通過Web錶單將自己的用戶名和密碼發送到後端的接口。這一過程一般是一個HTTP POST請求。建議的方式是通過SSL加密的傳輸(https協議),從而避免敏感信息被嗅探
2、後端核對用戶名和密碼成功後,將用戶的id等其他信息作為JWT Payload(負載),將其與頭部分別進行Base64編碼拼接後簽名,形成一個JWT(Token)。包含用戶信息,一起返回給前端,這樣就不需要和session一樣將用戶信息存儲在服務器端,就不會占用服務器的內存。
3、後端將JWT字符串作為登錄成功的返回結果返回給前端。前端可以將返回的結果保存在localStorage或sessionStorage上,退出登錄時前端删除保存的JWT即可。
4、前端在每次請求時將JWT放入HTTP Header中的Authorization比特。(放在Header中可以解决XSS和XSRF問題)
5、後端檢查是否存在,如存在驗證JWT的有效性。例如,檢查簽名是否正確;檢查Token是否過期;檢查Token的接收方是否是自己(可選)。
6、驗證通過後後端使用JWT中包含的用戶信息進行其他邏輯操作,返回相應結果。
4.2、使用JWT的優勢
1、簡潔(Compact): 可以通過URL,POST參數或者在HTTP header發送,因為數據量小,傳輸速度也很快
2、自包含(Self-contained):負載中包含了所有用戶所需要的信息,避免了多次查詢數據庫
3、因為Token是以JSON加密的形式保存在客戶端的,所以JWT是跨語言的,原則上任何web形式都支持
4、不需要在服務端保存會話信息,特別適用於分布式微服務
边栏推荐
- Understanding of cross domain and how to solve cross domain problems
- How to determine whether an array contains an element
- Leetcode 184 Employees with the highest wages in the Department (July 3, 2022)
- What are the reasons for the frequent high CPU of ECS?
- win10清除快速访问-不留下痕迹
- MySQL information_ Schema database
- Google Chrome browser will support the function of selecting text translation
- Compound nonlinear feedback control (2)
- Sword finger offer II 038 Daily temperature
- Excel 比较日器
猜你喜欢
Configure cross compilation tool chain and environment variables
剑指 Offer II 038. 每日温度
Design and implementation of redis 7.0 multi part AOF
【微服务】Nacos集群搭建以及加载文件配置
(4) Canal multi instance use
High performance parallel programming and optimization | lesson 02 homework at home
VB. Net simple processing pictures, black and white (class library - 7)
BUU-Crypto-Cipher
transformer坑了多少算力
Experience weekly report no. 102 (July 4, 2022)
随机推荐
Leetcode question brushing record | 206_ Reverse linked list
AWT常用组件、FileDialog文件选择框
SQL performance optimization skills
Understanding of cross domain and how to solve cross domain problems
Component、Container容器常用API详解:Frame、Panel、ScrollPane
BUU-Crypto-[GXYCTF2019]CheckIn
卸载Google Drive 硬盘-必须退出程序才能卸载
Halcon image calibration enables subsequent image processing to become the same as the template image
[microservice] Nacos cluster building and loading file configuration
Uninstall Google drive hard drive - you must exit the program to uninstall
Easy change
[Chongqing Guangdong education] electronic circuit homework question bank of RTVU secondary school
How to expand all collapse panels
Review | categories and mechanisms of action of covid-19 neutralizing antibodies and small molecule drugs
fastjson
transformer坑了多少算力
如何展开Collapse 的所有折叠面板
MySQL的information_schema数据库
Zhanrui tankbang | jointly build, cooperate and win-win zhanrui core ecology
SQL injection - injection based on MSSQL (SQL Server)