OAuth2和JWT - 如何設(shè)計(jì)安全的API布疼?

Moakap譯乃秀,原文 OAuth 2 VS JSON Web Tokens: How to secure an API

本文會(huì)詳細(xì)描述兩種通用的保證API安全性的方法:OAuth2JSON Web Token (JWT)

假設(shè):

  • 你已經(jīng)或者正在實(shí)現(xiàn)API
  • 你正在考慮選擇一個(gè)合適的方法保證API的安全性藤肢;

JWT和OAuth2比較太闺?

要比較JWTOAuth2?首先要明白一點(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)用訪問特定資源逃延。既然JWTOAuth2沒有可比性,為什么還要把這兩個(gè)放在一起說呢轧拄?實(shí)際中確實(shí)會(huì)有很多人拿JWTOAuth2作比較揽祥。標(biāo)題里把這兩個(gè)放在一起,確實(shí)有誤導(dǎo)的意思檩电。很多情況下拄丰,在討論OAuth2的實(shí)現(xiàn)時(shí),會(huì)把JSON Web Token作為一種認(rèn)證機(jī)制使用俐末。這也是為什么他們會(huì)經(jīng)常一起出現(xiàn)料按。

先來搞清楚JWTOAuth2究竟是干什么的~

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)通過特定算法對HeaderClaims進(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)一步討論OAuth2JWT的實(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é)論前,我們先來列舉一下 JWTOAuth2的主要使用場景棋返。

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.

博客原文地址:OAuth2和JWT-如何設(shè)計(jì)安全的API?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末对粪,一起剝皮案震驚了整個(gè)濱河市右冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌著拭,老刑警劉巖纱扭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儡遮,居然都是意外死亡乳蛾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門鄙币,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屡久,“玉大人,你說我怎么就攤上這事爱榔”换罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵详幽,是天一觀的道長筛欢。 經(jīng)常有香客問我浸锨,道長,這世上最難降的妖魔是什么版姑? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任柱搜,我火速辦了婚禮,結(jié)果婚禮上剥险,老公的妹妹穿的比我還像新娘聪蘸。我一直安慰自己,他們只是感情好表制,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布健爬。 她就那樣靜靜地躺著,像睡著了一般么介。 火紅的嫁衣襯著肌膚如雪娜遵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天壤短,我揣著相機(jī)與錄音设拟,去河邊找鬼。 笑死久脯,一個(gè)胖子當(dāng)著我的面吹牛纳胧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帘撰,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼躲雅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骡和?” 一聲冷哼從身側(cè)響起相赁,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慰于,沒想到半個(gè)月后钮科,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婆赠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年绵脯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片休里。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛆挫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妙黍,到底是詐尸還是另有隱情悴侵,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布拭嫁,位于F島的核電站可免,受9級特大地震影響抓于,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浇借,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一捉撮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妇垢,春花似錦巾遭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睬愤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纹安,已是汗流浹背尤辱。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厢岂,地道東北人光督。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像塔粒,于是被迫代替她去往敵國和親结借。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348