淺談有狀態跟無狀態的認證(登入)_Stateful vs Stateless Authentication

 
在前幾篇我們知道JWT主要用於授權(Authorization)
而非使用者的身分認證(Authentication)


身分認證(Authentication)
就是指透過帳號或者使用者名稱跟密碼來驗證當前使用者的身分
講白話一點就是 用戶登入的功能


授權(Authorization)
代表當使用者登入後是否有足夠權限訪問特定某些資源


而通常web api回傳若無足夠授權
大多返回401 Unauthorized





Stateful vs Stateless Authentication




Stateful 



傳統的登入機制也就是具有狀態的(Session-Based Authentication)
又可被稱作cookie-based Auth

使用者clinet端的Browser當進行LOGIN 表單提交後
會在Server端去建立與保存Session
再藉由cookie攜帶著session id 返回到Clinet端(session id會保存在前端cookie當中)
接著當登入後的用戶要訪問資源就會
攜帶包含session id的cookie再打到server端請求


Stateless


又稱 Token-Based Authentication (例如:JWT)

使用者clinet端的Browser當進行LOGIN 表單提交後
會於server針對跟身分認證有關的屬性(信箱,帳號,權限,通常不會包含密碼)作加密處理
並返回給clinet端一個token(jwt)
clinet接受後可能會保存於cookie或local storage
而且生成的這個token並不需要保存於server只存於clinet!(server完全不需要保存任何狀態)
利於分散式架構的部屬

接著當登入後的用戶要訪問資源就會將token封裝在http header當中
在發送請求給server做處理
server端接收到後會使用自己的私鑰來對請求文件做解密,用相同密碼來驗證JWT。
解密成功而且資料也仍在有效期限內則代表用戶確實已登入
若JWT描述的此用戶權限確實允許訪問特定資源就返回給clinet。







Ref:
https://github.com/facg3/Stateless-vs-stateful-authentication
https://ithelp.ithome.com.tw/articles/10235315?sc=iThelpR
https://medium.com/%E9%BA%A5%E5%85%8B%E7%9A%84%E5%8D%8A%E8%B7%AF%E5%87%BA%E5%AE%B6%E7%AD%86%E8%A8%98/%E7%AD%86%E8%A8%98-http-cookie-%E5%92%8C-session-%E4%BD%BF%E7%94%A8-19bc740e49b5




留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header