Web開發中常見的認證機制

HTTP基本認證(HTTP Basic Auth)

在HTTP中,HTTP基本認證是一種容許Web瀏覽器或者其餘客戶端在請求時提供用戶名口令形式的身份憑證的一種登陸驗證方式。html

簡單而言,HTTP基本認證就是咱們平時在網站中最經常使用的經過用戶名和密碼登陸來認證的機制。
優勢
HTTP 基本認證是基本上全部流行的網頁瀏覽器都支持。可是基本認證不多在可公開訪問的互聯網網站上使用,有時候會在小的私有系統中使用。
缺點
HTTP 基本認證雖然足夠簡單,可是前提是在客戶端和服務器主機之間的鏈接足夠安全。若是沒有使用SSL/TLS這樣的傳輸層安全的協議,那麼以明文傳輸的密鑰和口令很容易被攔截。
因爲現存的瀏覽器保存認證信息直到標籤頁或瀏覽器關閉,或者用戶清除歷史記錄。致使了服務器端沒法主動來當前用戶登出或者認證失效。前端

OAuth(開放受權)

OAuth 是一個開放標準,容許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表等),而無需將用戶名和密碼提供給第三方應用。
OAuth 容許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶能夠受權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非全部內容。
現存在OAuth 1.0OAuth 2.0兩種協議,兩者互不兼容。
OAuth 2.0 運行流程vue

流程引用自OAuth2.0 RFC 6749:https://tools.ietf.org/html/r...ios

圖片描述

  • (A)客戶端(Client)向資源擁有者(Resource Owner)發送受權請求(Authorization Request)git

  • (B)資源擁有者受權許可(Authorization Grant)github

  • (C)客戶端向驗證服務器(Authorization Server)發送經過(B)獲取的受權許可web

  • (D)驗證服務器驗證受權許可,經過的話,則返回Access Token給客戶端redis

  • (E)客戶端經過Access Token 訪問資源服務器(Resource Server)數據庫

  • (F)資源服務器返回受保護的資源(Protected Resource)axios

這種基於OAuth的認證機制很是適用於我的消費者類的互聯網應用產品,如社交類等等。一些大的互聯網公司也都提供OAuth機制的API,如豆瓣、微信JS-SDK。

Cookie/Session 認證機制

Cookie 是由客戶端保存的小型文本文件,其內容爲一系列的鍵值對。Cookie 是由 HTTP 服務器設置的,保存在瀏覽器中。Cookie會隨着 HTTP請求一塊兒發送。
Session 是存儲在服務器端的,避免在客戶端 Cookie 中存儲敏感數據。Session 能夠存儲在 HTTP 服務器的內存中,也能夠存在內存數據庫(如redis)中。
Cookie/Session認證機制就是爲一次請求認證在服務端建立一個Session對象,同時在客戶端的瀏覽器端建立了一個Cookie對象;經過客戶端帶上來Cookie對象來與服務器端的session對象匹配來實現狀態管理的。默認的,當咱們關閉瀏覽器的時候,cookie會被刪除。但能夠經過修改cookie 的expire time使cookie在必定時間內有效;

基於 Token 的認證機制

基於 Token的認證機制,有着無需長期保存用戶名和密碼,服務器端能主動讓token失效等諸多好處,很是實用於 Web 應用和 App 已經被不少大型網站採用,好比Facebook、Github、Google+等。其流程以下:

  1. 客戶端使用用戶名和密碼請求登陸

  2. 服務端收到請求,去驗證用戶名與密碼

  3. 驗證成功後,服務器會簽發一個 Token, 再把這個 Token 發送給客戶端

  4. 客戶端收到 Token 之後能夠把它存儲起來,如Cookie或者Web Storage

  5. 客戶單每次向服務端請求資源的時候,都須要帶着服務器端簽發的 Token

  6. 服務器端收到請求,驗證客戶端請求裏面帶着的 Token,若是驗證成功,就向客戶端返回請求的數據;否的話,則返回對應的錯誤信息。

可是存儲在客戶端的 Token 存在幾個問題:

  1. 存在泄露的風險。若是別人拿到你的 Token,在 Token過時以前,均可以以你的身份在別的地方登陸

  2. 若是存在 Web Storage(指sessionStorage和localStorage)。因爲Web Storage 能夠被同源下的JavaScript直接獲取到,這也就意味着網站下全部的JavaScript代碼均可以獲取到web Storage,這就給了XSS機會

  3. 若是存在Cookie中。雖然存在Cookie可使用HttpOnly來防止XSS,可是使用 Cookie 卻又引起了CSRF

對於泄露的風險,能夠採起對Token進行對稱加密,用時再解密。
對於XSS而言,在處理數據時,都應該 escape and encode 全部不信任的數據。
與CSRF相比,XSS更加容易防範和意識到,所以並不建議將Token存在Cookie中。
最後,網站或者應用必定要使用HTTPS。畢竟在網絡層面上 Token 明文傳輸的話,仍是很是的危險。

關於基於Token認證機制的項目能夠參考:一個項目學會前端實現登陸攔截
以上是我我的的見解,若有錯誤,歡迎指出。

參考資料

維基百科-HTTP基本認證

維基百科-OAuth

相關文章
相關標籤/搜索