是一種讓伺服器和使用者之間安全溝通的方式,是一個獨立的 Token,通常用於「無狀態」的身份驗證。
當你登入成功後,伺服器會幫你生成一個「身份憑證」(也就是這個 Token),接著你每次發送請求(例如:查詢資料、操作功能)時,都要把這個 Token 附上,這樣伺服器就知道是你在操作。
伺服器收到你的請求後,會檢查這個 Token 是不是有效,確定沒問題後才會讓你繼續。
去一個景點園區玩的時候,買了門票,園區人員會檢查我的門票才讓我進入園區,出去園區上廁所再進來時,也需要再次查看門票,才能再次進入園區。
JWT 就像你當天購買的「門票」,會有期限。
如果明天要再進來,要重新購買。
這裡會說明這個 Token 使用什麼編碼方式和類型,通常是像 HS256 這種加密算法,類型就是 "JWT"。
{
"alg": "HS256",
"typ": "JWT"
}
是一個 JSON 物件。
裡面放的是你的資料,像是使用者ID、名稱、角色等等,稱為 Claims。
這是一些標準的欄位,例如 iss(發行者)、exp(到期時間)、sub(主題)。
這是可以公開給所有人看的資訊,例如使用者名稱、email。
這是你自訂的資料,用於你的應用程式。
{
"sub": "1234567890",
"name": "Lina",
"admin": true
}
這是伺服器用來保護 Token 不被竄改的關鍵部分。
它是將 Header、Payload 進行編碼,然後使用一個祕密金鑰來生成的。
每次 Token 傳回來,伺服器都會用這個 Signature 來檢查它是否還是原本的樣子,沒有被改過。
當使用者成功登入後,伺服器會根據使用者資訊生成一個 JWT,並將它回傳給使用者。
通常前端會將這個 Token 保存到 Local Storage 或 Cookie 中。
使用者在發送請求時,會將這個 JWT 附加在 Authorization 中(格式:Bearer ),伺服器可以驗證這個 JWT,從而知道請求來自哪個使用者。
伺服器會根據預設的算法和祕密金鑰來驗證 JWT 是否有效,如果驗證通過,就知道這個請求是沒問題的。
假設你去了一家咖啡店,點了一杯咖啡,店員給你一個小卡片,上面寫著你點的咖啡類型。
每次你想要喝咖啡時,只要把這張卡片給店員,店員就知道你要什麼,「根本不需要記住你是誰」。
你每次去都帶著卡片(Token),所以伺服器只需要看這張卡片來確認你的身份。
這樣做很方便,伺服器不需要儲存任何資料,適合需要處理很多請求的情況,像是大型網站或應用程式。
像是 JWT(JSON Web Token),你登入後會得到一個 Token,之後每次請求都帶著這個 Token。
假設你去的是一個小型的咖啡店,店員會記住你的名字和你喜歡的咖啡類型。
當你下次進來時,店員會直接給你你喜歡的那杯咖啡,根本不需要你告訴他。
伺服器儲存著每位客人的資訊(Session),像是你的名字和餐點喜好等等。
這對於小型應用程式或使用頻率不高的情境來說很方便,因為伺服器能快速找到使用者的資訊。
傳統的 Session 機制,登入後伺服器會產生一個 Session,並把 Session ID 回傳給你,接下來每次都帶著這個 ID。
伺服器也能隨時作廢 Session。
iThome鐵人賽