Moakap譯乃秀,原文 OAuth 2 VS JSON Web Tokens: How to secure an API
本文會(huì)詳細(xì)描述兩種通用的保證API
安全性的方法:OAuth2
和JSON Web Token (JWT)
假設(shè):
- 你已經(jīng)或者正在實(shí)現(xiàn)
API
; - 你正在考慮選擇一個(gè)合適的方法保證
API
的安全性藤肢;
JWT和OAuth2比較太闺?
要比較JWT
和OAuth2
?首先要明白一點(diǎn)就是谤草,這兩個(gè)根本沒有可比性跟束,是兩個(gè)完全不同的東西。
JWT是一種認(rèn)證協(xié)議
????????JWT
提供了一種用于發(fā)布接入令牌(Access Token),并對發(fā)布的簽名接入令牌進(jìn)行驗(yàn)證的方法丑孩。 令牌(Token)本身包含了一系列聲明冀宴,應(yīng)用程序可以根據(jù)這些聲明限制用戶對資源的訪問。OAuth2是一種授權(quán)框架
????????另一方面温学,OAuth2
是一種授權(quán)框架略贮,提供了一套詳細(xì)的授權(quán)機(jī)制(指導(dǎo))。用戶或應(yīng)用可以通過公開的或私有的設(shè)置仗岖,授權(quán)第三方應(yīng)用訪問特定資源逃延。既然JWT
和OAuth2
沒有可比性,為什么還要把這兩個(gè)放在一起說呢轧拄?實(shí)際中確實(shí)會(huì)有很多人拿JWT
和OAuth2
作比較揽祥。標(biāo)題里把這兩個(gè)放在一起,確實(shí)有誤導(dǎo)的意思檩电。很多情況下拄丰,在討論OAuth2
的實(shí)現(xiàn)時(shí),會(huì)把JSON Web Token
作為一種認(rèn)證機(jī)制使用俐末。這也是為什么他們會(huì)經(jīng)常一起出現(xiàn)料按。
先來搞清楚JWT
和OAuth2
究竟是干什么的~
JSON Web Token (JWT)
JWT在標(biāo)準(zhǔn)中是這么定義的:
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).
-RFC7519 https://tools.ietf.org/html/rfc7519
????????JWT
是一種安全標(biāo)準(zhǔn)∽矿铮基本思路就是用戶提供用戶名和密碼給認(rèn)證服務(wù)器载矿,服務(wù)器驗(yàn)證用戶提交信息信息的合法性;如果驗(yàn)證成功烹卒,會(huì)產(chǎn)生并返回一個(gè)Token
(令牌)闷盔,用戶可以使用這個(gè)token
訪問服務(wù)器上受保護(hù)的資源。
一個(gè)token的例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
一個(gè)token包含三部分:
header.claims.signature
為了安全的在url中使用旅急,所有部分都 base64 URL-safe
進(jìn)行編碼處理逢勾。
Header頭部分
????????頭部分簡單聲明了類型(JWT)以及產(chǎn)生簽名所使用的算法。
{
"alg" : "AES256",
"typ" : "JWT"
}
Claims聲明
????????聲明部分是整個(gè)token
的核心坠非,表示要發(fā)送的用戶詳細(xì)信息敏沉。有些情況下果正,我們很可能要在一個(gè)服務(wù)器上實(shí)現(xiàn)認(rèn)證炎码,然后訪問另一臺(tái)服務(wù)器上的資源盟迟;或者,通過單獨(dú)的接口來生成token
潦闲,token
被保存在應(yīng)用程序客戶端(比如瀏覽器)使用攒菠。
一個(gè)簡單的聲明(claim)的例子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature簽名
????????簽名的目的是為了保證上邊兩部分信息不被篡改。如果嘗試使用Bas64
對解碼后的token
進(jìn)行修改歉闰,簽名信息就會(huì)失效辖众。一般使用一個(gè)私鑰(private key)通過特定算法對Header
和Claims
進(jìn)行混淆產(chǎn)生簽名信息,所以只有原始的token
才能于簽名信息匹配和敬。
????????這里有一個(gè)重要的實(shí)現(xiàn)細(xì)節(jié)凹炸。只有獲取了私鑰的應(yīng)用程序(比如服務(wù)器端應(yīng)用)才能完全認(rèn)證token
包含聲明信息的合法性。所以昼弟,永遠(yuǎn)不要把私鑰信息放在客戶端(比如瀏覽器)啤它。
OAuth2是什么?
????????相反舱痘,OAuth2
不是一個(gè)標(biāo)準(zhǔn)協(xié)議变骡,而是一個(gè)安全的授權(quán)框架。它詳細(xì)描述了系統(tǒng)中不同角色芭逝、用戶塌碌、服務(wù)前端應(yīng)用(比如API),以及客戶端(比如網(wǎng)站或移動(dòng)App)之間怎么實(shí)現(xiàn)相互認(rèn)證旬盯。
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.
-RFC6749 https://tools.ietf.org/html/rfc6749
這里簡單說一下涉及到的基本概念台妆。
Roles角色
應(yīng)用程序或者用戶都可以是下邊的任何一種角色:
- 資源擁有者
- 資源服務(wù)器
- 客戶端應(yīng)用
- 認(rèn)證服務(wù)器
Client Types客戶端類型
這里的客戶端主要指API的使用者。它可以是的類型:
- 私有的
- 公開的
Client Profile客戶端描述
OAuth2框架也指定了集中客戶端描述瓢捉,用來表示應(yīng)用程序的類型:
- Web應(yīng)用
- 用戶代理
- 原聲應(yīng)用
Authorization Grants認(rèn)證授權(quán)
認(rèn)證授權(quán)代表資源擁有者授權(quán)給客戶端應(yīng)用程序的一組權(quán)限频丘,可以是下邊幾種形式:
- 授權(quán)碼
- 隱式授權(quán)
- 資源擁有者密碼證書
- 客戶端證書
- Endpoints終端
OAuth2框架需要下邊幾種終端:
- 認(rèn)證終端
- Token終端
- 重定向終端
從上邊這些應(yīng)該可以看出,OAuth2
定義了一組相當(dāng)復(fù)雜的規(guī)范泡态。
使用HTTPS保護(hù)用戶密碼
????????在進(jìn)一步討論OAuth2
和JWT
的實(shí)現(xiàn)之前搂漠,有必要說一下,兩種方案都需要SSL安全保護(hù)某弦,也就是對要傳輸?shù)臄?shù)據(jù)進(jìn)行加密編碼桐汤。
????????安全地傳輸用戶提供的私密信息,在任何一個(gè)安全的系統(tǒng)里都是必要的靶壮。否則任何人都可以通過侵入私人wifi
怔毛,在用戶登錄的時(shí)候竊取用戶的用戶名和密碼等信息。
一些重要的實(shí)施考慮
在做選擇之前腾降,參考一下下邊提到的幾點(diǎn)拣度。
時(shí)間投入
???????? OAuth2
是一個(gè)安全框架,描述了在各種不同場景下,多個(gè)應(yīng)用之間的授權(quán)問題抗果。有海量的資料需要學(xué)習(xí)筋帖,要完全理解需要花費(fèi)大量時(shí)間。甚至對于一些有經(jīng)驗(yàn)的開發(fā)工程師來說冤馏,也會(huì)需要大概一個(gè)月的時(shí)間來深入理解OAuth2
日麸。 這是個(gè)很大的時(shí)間投入。
????????相反逮光,JWT
是一個(gè)相對輕量級的概念代箭。可能花一天時(shí)間深入學(xué)習(xí)一下標(biāo)準(zhǔn)規(guī)范涕刚,就可以很容易地開始具體實(shí)施嗡综。
出現(xiàn)錯(cuò)誤的風(fēng)險(xiǎn)
????????OAuth2
不像JWT
一樣是一個(gè)嚴(yán)格的標(biāo)準(zhǔn)協(xié)議,因此在實(shí)施過程中更容易出錯(cuò)杜漠。盡管有很多現(xiàn)有的庫蛤高,但是每個(gè)庫的成熟度也不盡相同,同樣很容易引入各種錯(cuò)誤碑幅。在常用的庫中也很容易發(fā)現(xiàn)一些安全漏洞戴陡。
????????當(dāng)然,如果有相當(dāng)成熟沟涨、強(qiáng)大的開發(fā)團(tuán)隊(duì)來持續(xù)OAuth2
實(shí)施和維護(hù)恤批,可以一定成都上避免這些風(fēng)險(xiǎn)。
社交登錄的好處
????????在很多情況下,使用用戶在大型社交網(wǎng)站的已有賬戶來認(rèn)證會(huì)方便裹赴。
????????如果期望你的用戶可以直接使用Facebook
或者Gmail
之類的賬戶,使用現(xiàn)有的庫會(huì)方便得多喜庞。
結(jié)論
做結(jié)論前,我們先來列舉一下 JWT
和OAuth2
的主要使用場景棋返。
JWT使用場景
無狀態(tài)的分布式API
????????JWT
的主要優(yōu)勢在于使用無狀態(tài)延都、可擴(kuò)展的方式處理應(yīng)用中的用戶會(huì)話。服務(wù)端可以通過內(nèi)嵌的聲明信息睛竣,很容易地獲取用戶的會(huì)話信息晰房,而不需要去訪問用戶或會(huì)話的數(shù)據(jù)庫。在一個(gè)分布式的面向服務(wù)的框架中射沟,這一點(diǎn)非常有用殊者。
????????但是,如果系統(tǒng)中需要使用黑名單實(shí)現(xiàn)長期有效的token
刷新機(jī)制验夯,這種無狀態(tài)的優(yōu)勢就不明顯了猖吴。
優(yōu)勢
- 快速開發(fā)
- 不需要cookie
- JSON在移動(dòng)端的廣泛應(yīng)用
- 不依賴于社交登錄
- 相對簡單的概念理解
限制
- Token有長度限制
- Token不能撤銷
- 需要token有失效時(shí)間限制(exp)
- OAuth2使用場景
在作者看來兩種比較有必要使用OAuth2的場景:
外包認(rèn)證服務(wù)器
????????上邊已經(jīng)討論過,如果不介意API
的使用依賴于外部的第三方認(rèn)證提供者挥转,你可以簡單地把認(rèn)證工作留給認(rèn)證服務(wù)商去做海蔽。
????????也就是常見的共屈,去認(rèn)證服務(wù)商(比如facebook
)那里注冊你的應(yīng)用,然后設(shè)置需要訪問的用戶信息党窜,比如電子郵箱趁俊、姓名等。當(dāng)用戶訪問站點(diǎn)的注冊頁面時(shí)刑然,會(huì)看到連接到第三方提供商的入口。用戶點(diǎn)擊以后被重定向到對應(yīng)的認(rèn)證服務(wù)商網(wǎng)站暇务,獲得用戶的授權(quán)后就可以訪問到需要的信息泼掠,然后重定向回來。
優(yōu)勢
- 快速開發(fā)
- 實(shí)施代碼量小
- 維護(hù)工作減少
大型企業(yè)解決方案
????????如果設(shè)計(jì)的API
要被不同的App
使用垦细,并且每個(gè)App
使用的方式也不一樣择镇,使用OAuth2
是個(gè)不錯(cuò)的選擇。
????????考慮到工作量括改,可能需要單獨(dú)的團(tuán)隊(duì)腻豌,針對各種應(yīng)用開發(fā)完善、靈活的安全策略嘱能。當(dāng)然需要的工作量也比較大吝梅!這一點(diǎn),OAuth2
的作者也指出過:
To be clear, OAuth 2.0 at the hand of a developer with deep understanding of web security will likely result is a secure implementation. However, at the hands of most developers – as has been the experience from the past two years – 2.0 is likely to produce insecure implementations.
hueniverse - OAuth 2.0 and the Road to Hell
優(yōu)勢
- 靈活的實(shí)現(xiàn)方式
- 可以和JWT同時(shí)使用
- 可針對不同應(yīng)用擴(kuò)展
進(jìn)一步
- http://jwt.io - JWT官方網(wǎng)站惹骂,也可以查看到使用不同語言實(shí)現(xiàn)的庫的狀態(tài)苏携。
- http://oauth.net/2/ OAuth2官方網(wǎng)站, 也也可以查看到使用不同語言實(shí)現(xiàn)的庫的狀態(tài)。
- OAuth 2 tutorials - Useful overview of how OAuth 2 works
- Oauth2 Spec issues Eran Hammer’s (推進(jìn)OAuth標(biāo)準(zhǔn)的作者) views on what went wrong with the OAuth 2 spec process. Whatever your own opinion, good to get some framing by someone who understand’s key aspects of what make a security standard successful.
- Thoery and implemnetation: with Laravel and Angular Really informative guide to JWT in theory and in practice for Laravel and Angular.