JWT是什么?
目前創(chuàng)新互聯(lián)已為超過千家的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、綿陽服務器托管、企業(yè)網(wǎng)站設計、吉林網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
JSON Web Token(縮寫 JWT)是目前最流行的跨域認證解決方案。它是有三部分組成,示例如下,具體的講解如下(jwt是不會有空行的,下面只是為了顯示,便使用了換行看著比較方便)。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjMfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
它是由一個"."號隔開、三部分組成。
第一部分是header信息,
{
"alg": "HS256",// 加密的算法
"typ": "JWT"http:// 加密的方式,填寫JWT
}
第二部分是Payload,有固定的六個部分和自定義數(shù)據(jù)組成,自定義數(shù)據(jù)看自己的情況需要來定義,是可以省去的。
'iss' => 'https://www.qqdeveloper.com',// 簽發(fā)人
'exp' => time() + 86400,// 過期時間(這里的有效期時間為1天)
'sub' => '主題內容',// 主題
'aud' => '受眾內容',// 受眾
'nbf' => $time,// 生效時間
'iat' => $time,// 簽發(fā)時間
'jti' => 123,// 編號
第三部分是Signature(是對前兩部分加密得來的)。由于前兩部分是公開透明的數(shù)據(jù),因此防止數(shù)據(jù)的篡改和泄露,我們需要加密處理。首先,需要指定一個密鑰(secret)。這個密鑰只有服務器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認是 HMAC SHA256),按照下面的公式產(chǎn)生簽名。
第一部分的加密方式(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
最終生成的就是上面很長的一段字符串了。
為什么會使用JWT
這就需要從我們傳統(tǒng)的認證模式來說了,傳統(tǒng)的認證模式是基于session和cookie來實現(xiàn)用戶的認證和鑒權。具體的流程模式如下圖。
2.服務端在收到客戶端的請求時,生成一個唯一的sessionid,這里需要將該生成的session存儲在服務端,這個sessionid存儲具體的session內容,默認的是文件存儲,當然我們可以修改具體的存儲方式,例如數(shù)據(jù)庫存儲。
3.客戶端在接受到這個sessionid時,存在cookie里面,每次請求時攜帶該sessionid。
4.服務端在接收到客戶端的請求之后,根據(jù)客戶端發(fā)送的sessionid來進行認證與授權。
這里也推薦一下自己之前分享的一篇有關session于cookie的知識點。session與cookie詳解
2.服務端在收到客戶端的請求之后,生成一個唯一token,這里需要將該生成的token存儲在服務端,至于怎么存,可以和上面session與cookie的方式一致。也可以存在緩存數(shù)據(jù)庫中,如redis,memcached。
3.服務端將該token返回給客戶端,客戶端存在本地,可以存請求頭header中,也可以存在cookie中,同時也可以存在localstorage中。
4.向服務端發(fā)送請求時,攜帶該token,服務端進行認證或者授權。
2.服務端根據(jù)jwt的生成規(guī)則,生成一個token,并返回給客戶端,這里服務端是不需要存儲的。
3.客戶端在接受到該token時,存在客戶端。
4.客戶端向服務端發(fā)送請求時,服務端對請求的token進行解析,如果發(fā)現(xiàn)解析出來的數(shù)據(jù)和生成的數(shù)據(jù)是一致的代表是一個合法的token,則進行相應的操作。
基于session和cookie的認證和鑒權模式有什么好與不好的地方呢?總結如下幾點:
通過上面幾張圖,我們也大致可以看得出來,基于session都是需要服務端存儲的,而JWT是不需要服務端來存儲的。針對以上幾點,總結如下:
一、缺點
1.容易遇到跨域問題。不同域名下是無法通過session直接來做到認證和鑒權的。
2.分布式部署的系統(tǒng),需要使用共享session機制
3.容易出現(xiàn)csrf問題。
二、優(yōu)點
1.方便靈活,服務器端直接創(chuàng)建一個sessionid,下發(fā)給客戶端,客戶端請求攜帶sessionid即可。
2.session存儲在服務端,更加安全。
3.便于服務端清除session,讓用戶重新授權一次。
JWT與session有什么區(qū)別呢?
JWT是基于客戶端存儲的一種認證方式,然而session是基于服務端存儲的一種認證方式。JWT雖然不用服務端存儲了,也可以避免跨域、csrf等情況。但也存在如下幾個不太好的地方。
1.無法清除認證token。由于JWT生成的token都是存儲在客戶端的,不能有服務端去主動清除,只有直到失效時間到了才能清除。除非服務端的邏輯做了改變。
2.存儲在客戶端,相對服務端,安全性更低一些。當JWT生成的token被破解,我們不便于清除該token。
如何使用JWT
這里推薦使用GitHub上面人家封裝好的包,這里我使用的是firebase/php-jwt,在項目中直接使用即可安裝成功。
composer require firebase/php-jwt
接下來創(chuàng)建一個控制器,我這里使用的ThinkPHP5.1的框架
use think\Controller;
use Firebase\JWT\JWT;
class Test extends Controller
{
private $key = 'jwtKey';
// 生成JWT
public function createJwt()
{
$time = time();
$key = $this->key;
$token = [
'iss' => 'https://www.qqdeveloper.com',// 簽發(fā)人
'exp' => $time + 86400,// 過期時間(這里的有效期時間為1天)
'sub' => '主題內容',// 主題
'aud' => '受眾內容',// 受眾
'nbf' => $time,// 生效時間
'iat' => $time,// 簽發(fā)時間
'jti' => 123,// 編號
// 額外自定義的數(shù)據(jù)
'data' => [
'userName' => '編程浪子走四方'
]];
// 調用生成加密方法('Payloadn內容','加密的鍵',['加密算法'],['加密的可以'],['JWT的header頭'])
$jwt = JWT::encode($token, $key);
return json(['data' => $jwt]);
}
// 解析JWT
public function analysisJwt()
{
try {
$key = $this->key;
$jwt = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9leGFtcGxlL1yZyIsImV4cCI6MTU2ODA5NjE4MCwic3ViIjoiXHU0ZTNiXHU5ODk4XHU1MTg1XHU1YmI5IiwiYXVkIjoiXHU1M2Q3XHU0ZjE3XHU1MTg1XHU1YmI5IiwibmJmIjoxNTY4MDA5NzgwLCJpYXQiOjE1NjgwMDk3ODAsImp0aSI6MTIzLCJkYXRhIjp7InVzZXJOYW1lIjoiXHU3ZjE2XHU3YTBiXHU2ZDZhXHU1YjUwXHU4ZDcwXHU1NmRiXHU2NWI5In19.kHb_9Np0zjE25YE9czUEGvmFPYtqMJT9tuZzJTuMZl0';
// 調用解密方法('JWT內容','解密的鍵,和加密時的加密鍵一直','加密算法')
$decoded = JWT::decode($jwt, $key, array('HS256'));
return json(['message' => $decoded]);
} catch (\Exception $exception) {
return json(['message' => $exception->getMessage()]);
}
}
}
通過訪問第一個方法,可以生成下圖一段字符串
我們將上圖中的字符串復制到第二圖中的$jwt變量,訪問第二個方法即可解析出具體的數(shù)據(jù)。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。