淺談有狀態跟無狀態的認證(登入)_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