簡介
JSON Web Token(JWT)是一種輕量級、基於 JSON 格式的開放標準(RFC 7519),常用於身份驗證與資訊交換。JWT 的特點是不需要在伺服器端儲存使用者狀態,它包含了一段被簽章過的資料,可讓接收端驗證其完整性與真實性。
結構
JWT 結構分為三個部分:
- Header(標頭):定義簽章使用的演算法與類型。
- Payload(內容):實際的資料內容,例如使用者 ID、到期時間等。
- Signature(簽章):用來驗證資料未被竄改。
格式為:
1 | {Base64UrlEncode(header)}.{Base64UrlEncode(payload)}.{Base64UrlEncode(signature)} |
安全性
JWT(JSON Web Token)之所以具備安全性,主要基於以下兩個核心原理:
- 資料完整性驗證(Integrity Verification):JWT 使用 HMAC 或非對稱加密(如 RSA、ECDSA)對內容進行簽章,確保資料在傳輸過程中未被竄改。任何試圖修改 payload 的行為,都會導致簽章驗證失敗,進而無法解碼成功。
- 不可逆簽章(Non-reversible Signature):以 HMAC 為例,簽章是根據密鑰與資料內容計算出的雜湊值。即使攻擊者能看到 JWT,也無法從簽章反推出密鑰或偽造新的簽章,除非已知密鑰。
簡言之,JWT 的安全性建立在加密雜湊函式(HMAC-SHA)或公開金鑰加密(如 RS256)所提供的資料完整性與密鑰保密性上。若搭配 HTTPS 傳輸協定,能有效避免中間人竊聽,達到足夠的傳輸與身份驗證安全性。
實作
建立專案。
1 | mkdir php-jwt-example |
建立 .gitignore
檔。
1 | vendor |
初始化專案。
1 | composer init |
修改 composer.json
檔。
1 | { |
執行安裝指令。
1 | composer install |
建立 SimpleJWT
資料夾。
1 | mkdir SimpleJWT |
在 SimpleJWT
資料夾,新增 JWTException.php
檔。
1 |
|
在 SimpleJWT
資料夾,新增 JWTException.php
檔。
1 |
|
使用
建立 index.php
檔。
1 |
|
執行程式。
1 | php index.php |
輸出如下:
1 | JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMywiZXhwIjoxNzQ0NTc1MTgxLCJpYXQiOjE3NDQ1NzE1ODEsInJvbGUiOiJhZG1pbiJ9.yXQlSVLIAlf7WBh2dmv9pv4VbNUDKyurkwtN-i1Tppw |