http無狀態和鑒權解決四種方案


 

http協議本身是無狀態的,但是在實際的web開發中常有一些操作需要有狀態.比如想要訪問一些私人訪問權限的文章,或者這種操作需要明確當前用戶身份.

顯然,最簡單的方案就是每次都發送賬戶和密碼,但是這樣重復操作用用戶並不友好,對服務器頁增添了額外的壓力.為了解決無狀態帶來的鑒權問題,一般有以下幾種解決方案:cookie、session、token.至於標題中提及的outh2、jwt本質上也是token方案.

http無狀態和鑒權解決四種方案http無狀態和鑒權解決四種方案

cookie

Cookie是儲存在客戶端的一串字符,一般說來大小不超過4kb.比如我們常見的記住密碼功能,或者一些基於之前輸入的提醒和默認配置,就是通過cookie來實現的,cookie簡單說來就是一種本地存儲方法.但是這里存儲的信息常用來進行鑒權操作.cookie只能保存文本信息,瀏覽器可以禁止cookie.cookie的期限可以被自由設定,可以是僅僅一次瀏覽起效,也可以長達一年.如果是短期的,那么這些信息會被存儲在內存中,如果是長期則會存儲在硬盤上.cookie的起效范圍是路徑下的所有子路徑.不允許其他來源的訪問.

單純的采用cookie來認證身份會帶來一個比較麻煩的問題,就是偽造比較容易.因為這樣處理,cookie中必然要帶有身份信息,但是服務器也要解析這個身份信息,所以必然要在原理上支持雙向的編碼和解碼,那么這個信息很容易被破解和進一步偽造.想一想,如果想要解決這個問題,我們常用的方案應該是加一個secret,而這個secret應該是放在服務器上的,服務器返回這樣一個帶有secret編碼的字符串,而在服務器端再帶上這個secret反向解密,如此一來,問題不就解決了嗎?確實如此,但是這不代表cookie就安全,因為這已經不叫cookie了,而是我們要講的第二個對象:session.

session

通過上面說的東西,我們已經能夠獲得身份信息,額外的,我們還可以把更復雜形式的信息都存儲進來,因為這里沒有cookie的純文本限制.但是剛才說的帶有secret編碼的字符串也就是sessionid,依然要存儲在客戶端.是不是意味着session必定要依賴cookie呢?不是!想一想,我們實際上需要的是在每一次請求(至少是需要判定身份狀態的請求中),都帶上這個字符串,我們有以下這幾種解決方案:

  1. cookie
  2. 表單隱藏字段:在form中放置一個隱藏的域
  3. url重寫:在url后邊加上session的query段

Session也可以設定有效時間.其實際的存儲可以在內存、緩存、文件中.通過類似//可能具體實現不同.//hash表的數據結構存儲.cookie是一個存在的實體,session是一種機制.

token

對token的理解還不夠,可能多有紕漏之處,待之后再進行修改.

使用基於 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的:

  1. 客戶端使用用戶名跟密碼請求登錄
  2. 服務端收到請求,去驗證用戶名與密碼
  3. 驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端
    客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
  4. 客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token
  5. 服務端收到請求,然后去驗證客戶端請求里面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據

可以看出來,這里的token與sessionid有些類似,其區別:

  1. sessionid是帶着之前的狀態的,在服務器端可以getSession(sessionid)
  2. token是在登錄驗證之后發放的一個包含着用戶基本信息的較長的字符串,用處是驗證身份以及簡化后續獲取信息的難度.
  3. token機制更靈活,可以實現跨域

jwt

Jwt簡單說來是一種token的具體實現規范!

Jwt標准的token有三個部分,中間用點分隔開,並且都會使用 Base64 編碼:

  1. header。header 部分主要是兩部分內容,一個是 Token 的類型,另一個是使用的算法
  2. Payload。里面是 Token 的具體內容,這些內容里面有一些是標准字段,你也可以添加其它需要的內容
  3. Signature。編碼以上兩個部分並且加入一個secret使用信息摘要算法得出一個字符串

oauth2

簡單來說,oauth是用來向第三方平台提供可以細致的權限管理的一種方案.
如何直接向第三方提供賬號和密碼,可能存在的問題有:

  1. 不安全
  2. 無法更細致的限制授權范圍和有效期
  3. 只有修改密碼才能收回權限
  4. 一個第三方程序被破解將會導致用戶密碼泄漏

OAuth的基本思路如下:

OAuth在”客戶端”與”服務提供商”之間,設置了一個授權層(authorization layer)。”客戶端”不能直接登錄”服務提供商”,只能登錄授權層,以此將用戶與客戶端區分開來。”客戶端”登錄授權層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的權限范圍和有效期。”客戶端”登錄授權層以后,”服務提供商”根據令牌的權限范圍和有效期,向”客戶端”開放用戶儲存的資料。

免費提供最新Linux技術教程書籍,為開源技術愛好者努力做得更多更好:https://www.linuxprobe.com/


免責聲明!

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



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