JWT Authentication

閱讀時間約 5 分鐘
JWT全名JSON Web Token,因符合RESTful API無狀態原則而誕生。
傳統我們通常會用cookie/session的方式來做身分認證,也就是user登入後,用session id當作一種token,來做身份認證。
然而用session這種方法server會有額外的儲存負擔,查詢也會需要時間,加上一般production server不會只有一台,如果用session的話會有server之間如何共享session的問題。(當然如果您的SLB是by ip分流那就另當別論了)

另外,使用JWT不會有像cookie一樣可能有無法跨域傳送的問題,也不會有CSRF攻擊的問題,因為我們不會把JWT儲存在cookie,不會讓瀏覽器自動送出,通常是駭客會透過攔截封包來擷取JWT,只不過還是建議使用HTTPS傳輸比較安全。
JWT字串由header, payload, signature三個部分組成,各自編碼後,用.串接起來即成為JWT字串。
JWT => Header.Payload.Signature

Header:

組成如下,alg是token被加密的演算法,typ是指token的type。
{
"alg": "HS256",
"typ": "JWT"
}
把這個json做base64 encode即為Header。

Payload:

這邊是放聲明訊息的地方,有以下幾種定義:
1. 標準聲明(Registered claims)
JWT規定的標準聲明,只是建議可以放,沒有強制一定要放。
2. 私有聲明(Private claims)
可自行定義的聲明,通常會放user的不敏感資料。
3. 公有聲明(Public claims)
實務上不太會需要用到,有時間再來研究。
Payload組成範例:
{
"iss": "http://www.example.com",
"exp": 1525318201,
"data": {
"user_id": 1,
"user_name": "Vic"
}
}
其中iss = JWT簽發者, exp = JWT的過期時間,這兩個都是標準聲明。標準聲明還有很多定義,可自行查詢。
data的部分就是自定義的user資料。
把這個json做base64 encode即為Payload。

Signature:

Signature是這樣組成的:

HMAC-SHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
其中secret=金鑰,只有伺服器知道這組金鑰。
HS256 = HMAC-SHA256
將header和payload json data做base64UrlEncode編碼後,用.來串接成data string,再使用header中指定的hash演算法HS256來對data string使用金鑰進行加密,產生簽名(signature)。

根據本文提到的範例,最終產生的JWT token如下圖:
Header.Payload.Signature
紅.紫.藍

JWT驗證流程如下:

1. 在前端打後端登入api,且user確認登入成功後,server會回傳這組JWT Token給前端。
2. 前端收到JWT Token後,一般會將其儲存在local storage中。
3. 之後前端要存取後端API的時候,需在header帶上這組token:
Authorization: Bearer ${JWT token}
假設JWT token是abc即為: Authorization: Bearer abc
4. 後端收到token後會驗證token有效性,決定是否可以存取此api。
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
Note: 本筆記使用的是Windows 10作業系統 1. 下載並安裝WAMP或XAMPP等等 本文是使用wamp,這邊略過安裝教學。 2. 下載並安裝Composer 至官網下載Composer windows installer,到這一步驟時,選擇PHP版本位置: ...
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
CSRF全名為 Cross Site Request Forgery( 跨站請求偽造)。
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
Note: 本筆記使用的是Windows 10作業系統 1. 下載並安裝WAMP或XAMPP等等 本文是使用wamp,這邊略過安裝教學。 2. 下載並安裝Composer 至官網下載Composer windows installer,到這一步驟時,選擇PHP版本位置: ...
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
CSRF全名為 Cross Site Request Forgery( 跨站請求偽造)。
1. 設定cookie為HttpOnly 在一般的情況下,cookie是可以透過javascript來存取的(document.cookie),如同上一篇所說的,有可能會有XSS攻擊的風險。 將cookie設定為HttpOnly,表示這個cookie無法透過js存取。
你可能也想看
Google News 追蹤
這篇文章將介紹兩個主要的認證工具:Passport 和 JWT。Passport 是一個簡單的身份驗證中介軟體,提供多種登入方式,而JWT則是一種stateless的認證方式,能減輕伺服器負擔。文章探討了 stateful 與 stateless 認證的區別,以及如何將這兩者結合提升安全性與效能。
Thumbnail
TWT币是一种加密数字货币,是由Trust Wallet发行的代币。Trust Wallet是一个兼容多种数字货币的去中心化钱包,它支持存储、发送和接收多种加密货币,并保持用户的私钥安全。TWT币作为... 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手
了解智能合约在去中心化身份认证中的群签名方案设计,如何实现安全、可靠的身份验证?本文将深入探讨智能合约技术在身份认证领域的应用和前景。 引言 智能合约技术的兴起为去中心化身份认证提供了新的解决方案。其中,群签名方案设计是智能合约在身份认证领域的重要应用之一。随着加密货币市场的发展,身份认证的安
在今日數位化的世界中,保護資料的安全性尤為重要。加密憑證(SSL/TLS Certificates)扮演著確保網站和用戶之間資料傳輸安全的重要角色。本文將深入探討加密憑證的原理、作用以及如何選擇適合的加密憑證來保護您的網站。 1. 加密憑證的基本概念 加密憑證是一種數位檔案,用於證明網站身份的真
Thumbnail
什麼是多因素驗證 (MFA)? 多因素驗證 (MFA) 是一種登入保護機制,需要使用者提供多個不同的驗證方式來確認身份。除了輸入密碼,使用者還可能需要: 輸入發送到手機的驗證碼 掃描指紋或面部 回答安全問題 這樣即使密碼被盜用,未經授權的用戶也很難登入帳戶。 為什麼需要多因素
HTTP(Hyper Text Transfer Protocol,超文字傳輸協定) 通常執行在TCP協定上。請求和回傳訊息的頭是ASCII,而內容是MIME。 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer) 以HT
Thumbnail
在串接第三方 API時,需要定期刷新 token,那有沒有辦法針對 request 和 response 做配置,在 token 過期時先做刷新、再做請求呢?本文要介紹利用 axios 套件提供的攔截器刷新 token 的作法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
進入區塊鏈/Web3的世界,首先需要擁有一個錢包或帳號。本文從重要名詞和觀念入手,介紹公鑰和私鑰的重要性,以及助記詞的作用。探討加密錢包的種類,從私鑰控制權和網路連接的角度進行分類。同時提醒了私鑰保管的重要性,以及在交易所和網路交互中的安全提醒。最後透過實際案例介紹了社交工程和釣魚的危害。
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊
這篇文章將介紹兩個主要的認證工具:Passport 和 JWT。Passport 是一個簡單的身份驗證中介軟體,提供多種登入方式,而JWT則是一種stateless的認證方式,能減輕伺服器負擔。文章探討了 stateful 與 stateless 認證的區別,以及如何將這兩者結合提升安全性與效能。
Thumbnail
TWT币是一种加密数字货币,是由Trust Wallet发行的代币。Trust Wallet是一个兼容多种数字货币的去中心化钱包,它支持存储、发送和接收多种加密货币,并保持用户的私钥安全。TWT币作为... 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手
了解智能合约在去中心化身份认证中的群签名方案设计,如何实现安全、可靠的身份验证?本文将深入探讨智能合约技术在身份认证领域的应用和前景。 引言 智能合约技术的兴起为去中心化身份认证提供了新的解决方案。其中,群签名方案设计是智能合约在身份认证领域的重要应用之一。随着加密货币市场的发展,身份认证的安
在今日數位化的世界中,保護資料的安全性尤為重要。加密憑證(SSL/TLS Certificates)扮演著確保網站和用戶之間資料傳輸安全的重要角色。本文將深入探討加密憑證的原理、作用以及如何選擇適合的加密憑證來保護您的網站。 1. 加密憑證的基本概念 加密憑證是一種數位檔案,用於證明網站身份的真
Thumbnail
什麼是多因素驗證 (MFA)? 多因素驗證 (MFA) 是一種登入保護機制,需要使用者提供多個不同的驗證方式來確認身份。除了輸入密碼,使用者還可能需要: 輸入發送到手機的驗證碼 掃描指紋或面部 回答安全問題 這樣即使密碼被盜用,未經授權的用戶也很難登入帳戶。 為什麼需要多因素
HTTP(Hyper Text Transfer Protocol,超文字傳輸協定) 通常執行在TCP協定上。請求和回傳訊息的頭是ASCII,而內容是MIME。 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer) 以HT
Thumbnail
在串接第三方 API時,需要定期刷新 token,那有沒有辦法針對 request 和 response 做配置,在 token 過期時先做刷新、再做請求呢?本文要介紹利用 axios 套件提供的攔截器刷新 token 的作法。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
進入區塊鏈/Web3的世界,首先需要擁有一個錢包或帳號。本文從重要名詞和觀念入手,介紹公鑰和私鑰的重要性,以及助記詞的作用。探討加密錢包的種類,從私鑰控制權和網路連接的角度進行分類。同時提醒了私鑰保管的重要性,以及在交易所和網路交互中的安全提醒。最後透過實際案例介紹了社交工程和釣魚的危害。
Thumbnail
授權碼模式連線流程 用戶端請求自己的伺服器。 伺服器發現用戶沒登入,就導向認證伺服器。 認證伺服器顯示授權頁面,等待用戶授權。 用戶確認授權後,授權頁面會向認證伺服器請求授權碼。 用戶獲取授權碼。 用戶將授權碼傳給伺服器。 伺服器拿授權碼向認證伺服器取得token。 應用註冊