IDaaS 即提供基於雲的身份認證和管理服務的平台,確保在准確判定用戶身份的基礎上,在正確的時間授予用戶正確的應用、文件和其他資源的訪問權限。IDaaS 能提供多種標准化功能幫助用戶實現高效、安全的身份認證管理服務,如單點登錄、智能多因素認證、賬號生命周期管理等等。
由於 IDaaS 在國內尚屬於新興產品形態,很多人對它只有模糊的印象,所以我們計划用一系列文章,深入淺出介紹 IDaaS 相關的技術原理和細節。本文是“IDaaS 技術解析”系列的第一篇。
單點登錄是 IDaaS 平台提供的關鍵功能之一,技術上涉及協議對接、認證方式等諸多細節,我們今天先來聊聊認證方式。由於傳統基於 Session 認證方式的局限性,目前單點登錄技術中一般使用 Token 認證,下文將詳細介紹 Token 認證的流程及相對優勢。
一、傳統基於 Session 的認證方式
在介紹 Token 認證前,先簡單介紹一下傳統基於 Session 的認證。早前由於 Http 協議無狀態的特性(每次客戶端和服務端會話完成時,服務端不會保存會話信息,包括用戶上一次登錄時輸入的用戶名和密碼),於是基於 Session的有狀態的認證方式逐漸成為一種流行技術方案,以減少用戶在登錄客戶端時輸入用戶名和密碼的認證操作次數。
簡單來說,基於 Session 的認證就是讓客戶端和服務端之間的認證會話以Session的形式進行存儲,並通過在服務端和客戶端之間傳輸 Session,來實現兩方之間的身份認證交流。具體流程如下:
1. 用戶在客戶端輸入用戶名和密碼,進行登錄操作;
2. 服務端用戶身份驗證通過,生成 Session,並存入數據庫中;
3. 客戶端在瀏覽器上生成 Cookie,並把 Session 寫入其中;
4. 用戶在客戶端后續有新的請求,都會在請求時攜帶 Session,並發給服務端;
5. 如果客戶端 log out,之前生成的 Session 會在客戶端和服務端都會被銷毀。
雖然 Session 認證有效解決了客戶端多次輸入用戶名和密碼的問題,但存在諸多弊端:
· 服務端成本上升:每個用戶在客戶端進行登錄操作后,服務端都需要進行一次 Session 記錄,隨着注冊用戶不斷增多,存儲 Session 就會占用大服務器內存,大型應用可能還需要借助數據庫或者一系列緩存機制存儲 Session。
· 無法橫向擴展: Session 認證方式在跨服務或跨域的資源共享方面表現很差。比如,多個子域名提供同一個應用服務,或者單點登錄中用戶通過一套用戶名和密碼同時登錄多個應用系統,Session 認證方式在這樣的場景中就無法再起作用,尤其是對於分布式應用而言,這種認證方式很難在多個服務器負載上進行橫向拓展。
· CSRF跨站點請求偽造(Cross—Site Request Forgery): Cookies 存在很多不安全因素,如果 Cookies 被截獲,用戶就會很容易受到 CSRF 的攻擊,導致數據泄露。
二、基於 Token 的認證方式
Token 認證是無狀態的,其核心是簽名和驗簽。客戶端每次向服務端發送請求時都會攜帶 Token,這里的 Token 是服務端用自己的密鑰簽名的,當服務端接收到 Token 時會用自己的密鑰去驗簽,判斷這個 Token 是否是自己簽發的,進而對用戶身份進行驗證。具體流程如下:
1. 客戶端使用用戶名和密碼請求登錄;
2. 服務端收到請求,去驗證用戶名與密碼;
3. 驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端(一般用哈希算法再加個隨機數);
4. 客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里;
5. 客戶端每次向服務端請求資源的時候需要攜帶服務端簽發的 Token;
6. 服務端收到請求,然后去驗證客戶端請求里面攜帶的Token,如果驗證成功,就向客戶端返回請求的數據。
從以上流程中可以看到,相較於傳統的 Session 認證,Token 認證在成本、可擴展性和安全性等方面都有一定的優勢:
· 服務端負載減輕:服務端無需對生成的Token進行保存,只需要對Token進行簽發和驗簽即可。Token中寫入很多身份驗證中所需要的信息,比如哈希簽名算法、用戶信息和簽名,服務端的負載會減輕許多。
· 通過API實現橫向擴展:基於Token的認證通過API調用的方式,可以將Token認證應用到不同的服務和域中,使分布式應用的身份認證實現起來更高效便捷。
· 不需要CSRF防護:由於不需要依賴Cookie,自然不用擔心Cookie被截獲,以及由此引發的用戶信息被偽造登錄的問題。
· 支持移動端訪問:Cookie本身不支持手機端訪問,Token認證機制在移動端具有極大的優勢。
JSON Web Token(JWT)是目前在單點登錄實踐中最為通用的Token認證方式。JWT包含頭部(header)、載荷(payload)和簽名(signature)三部分。IDP(Identity Provider,即身份服務提供者)會將用戶數據以加密的形式寫入JWT,SP(Service Provider,服務提供者)會對 JWT 進行存儲,IDP 會在隨后的 SP 每次請求中對 JWT進 行驗簽和確認,從而有效確保用戶私密信息不會被盜。
舉個例子,在單點登錄上采用 JWT 進行身份認證的 Token 簽發和驗簽,整個過程中沒有密碼等私密信息的傳遞,只會在跨服務器的信息共享中傳輸像郵箱這樣的身份標識符號,這樣可以從根本上規避身份認證信息泄露引發的數據泄露問題。
也可采用其他多種機制為Token的安全加碼:
- 采用 HTTPS 的形式對 Token 進行加密,對於常見的瀏覽器和操作系統,強制使用 TLS1.2 協議,而禁用 SSLv3(SSL MODE SEND FALLBACK SCSV)。服務所用 HTTPS 證書來自知名證書機構 GeoTrust,具有極高可用性,最高 256 位 SSL 加密,杜絕中間人監聽;
- 在 JWT 和對接應用服務之間采用定期密鑰輪轉機制,所有頒發的 Token 都具備強時效性,防止 Token 的超前使用或者過期使用,同時支持一次性 Token,使用過的 Token 也可以被記錄並禁止二次使用,從而降低偷竊者破解使用 Token 的可能性;
- 對於 Cookie 的安全,玉符全域防止 Cookie 挾持(Hijacking)和重放攻擊(Replay Attacks),並且所有超過 5 分鍾有效期的 Cookie 都可以在受威脅情況下強制失效,有效確保存儲在 Cookie 中 Token 信息的安全。