JWT和OAuth2 - 認證和授權的API應用場景


1 需求

你已經或者正在實現API;
你正在考慮選擇一個合適的方法保證API的安全性;

2 基本比較

要比較JWT和OAuth2?首先要明白一點就是,這兩個根本沒有可比性,是兩個完全不同的東西。

JWT是一種認證協議 
JWT提供了一種用於發布接入令牌(Access Token),並對發布的簽名接入令牌進行驗證的方法。 令牌(Token)本身包含了一系列聲明,
應用程序可以根據這些聲明限制用戶對資源的訪問。 OAuth2是一種授權框架 OAuth2不是一個標准協議,而是一個安全的授權框架,提供了一套詳細的授權機制。它詳細描述了系統中不同角色、用戶、服務前端應用(比如API),
以及客戶端(比如網站或移動App)之間怎么實現相互認證。用戶或應用可以通過公開的或私有的設置,授權第三方應用訪問特定資源。

  OAuth2用在使用第三方賬號登錄的情況(比如使用weibo, qq, github登錄某個應用)

  JWT是用在前后端分離, 需要簡單的對后台API進行保護時使用。(前后端分離無session, 頻繁傳用戶密碼不安全)

 

3 既然JWT和OAuth2沒有可比性,為什么還要把這兩個放在一起說呢?

比如微信是基於oauth2授權的,用戶掃碼登錄我需要微信授權,然后微信授權以后,用戶也點擊確認之后我就認定用戶為合法用戶,自己用jwt生成一個token給用戶,
用戶每次訪問都帶着token訪問我。在這里微信給我是授權,我給用戶是認證。oauth2是可以和jwt一起使用。
通常情況下可能【用戶名密碼登錄】以后你會用jwt給他頒發token來認證訪問。

4 JWT使用場景

無狀態的分布式API
JWT的主要優勢在於使用無狀態、可擴展的方式處理應用中的用戶會話。服務端可以通過內嵌的聲明信息,很容易地獲取用戶的會話信息,而不需要去訪問用戶或會話的數據庫。在一個分布式的面向服務的框架中,這一點非常有用。

但是,如果系統中需要使用黑名單實現長期有效的token刷新機制,這種無狀態的優勢就不明顯了。

優勢

快速開發
不需要cookie
JSON在移動端的廣泛應用
不依賴於社交登錄
相對簡單的概念理解

限制

Token有長度限制
Token不能撤銷
需要token有失效時間限制(exp)

5 oauth2的使用場景

OAuth2使用場景
在作者看來兩種比較有必要使用OAuth2的場景:

外包認證服務器
上邊已經討論過,如果不介意API的使用依賴於外部的第三方認證提供者,你可以簡單地把認證工作留給認證服務商去做。 
也就是常見的,去認證服務商(比如facebook)那里注冊你的應用,然后設置需要訪問的用戶信息,比如電子郵箱、姓名等。當用戶訪問站點的注冊頁面時,會看到連接到第三方提供商的入口。用戶點擊以后被重定向到對應的認證服務商網站,獲得用戶的授權后就可以訪問到需要的信息,然后重定向回來。

優勢

快速開發
實施代碼量小
維護工作減少
大型企業解決方案
如果設計的API要被不同的App使用,並且每個App使用的方式也不一樣,使用OAuth2是個不錯的選擇。

考慮到工作量,可能需要單獨的團隊,針對各種應用開發完善、靈活的安全策略。當然需要的工作量也比較大!
優勢

靈活的實現方式
可以和JWT同時使用
可針對不同應用擴展

6 重要的考量

(1)時間投入
OAuth2是一個安全框架,描述了在各種不同場景下,多個應用之間的授權問題。有海量的資料需要學習,要完全理解需要花費大量時間。甚至對於一些有經驗的開發工程師來說,也會需要大概一個月的時間來深入理解OAuth2。 這是個很大的時間投入。

相反,JWT是一個相對輕量級的概念。可能花一天時間深入學習一下標准規范,就可以很容易地開始具體實施。

(2)錯誤的風險
OAuth2不像JWT一樣是一個嚴格的標准協議,因此在實施過程中更容易出錯。盡管有很多現有的庫,但是每個庫的成熟度也不盡相同,同樣很容易引入各種錯誤。在常用的庫中也很容易發現一些安全漏洞。

當然,如果有相當成熟、強大的開發團隊來持續OAuth2實施和維護,可以一定成都上避免這些風險。

(3)社交登錄的好處
在很多情況下,使用用戶在大型社交網站的已有賬戶來認證會方便。
如果期望你的用戶可以直接使用Facebook或者Gmail或者微信之類的賬戶,使用現有的庫會方便得多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM