當我們賬號密碼登陸以後,如何確保使用者認證是我們每一個phper都會遇到的問題,從最開始的
Session
到Token
,讓我們帶著求知慾瞭解一下它。
Session時代
Web開發使用Http協議,HTTP協議最初是匿名的,無狀態的請求/響應協議。這樣簡單的設計可以使HTTP協議專注於資源的傳輸(HTTP是超文字傳輸協議);隨著WEB的發展,業務需要確定客戶端的唯一性,引入session
會話這個概念 。PHP設定session
整個過程如下,我們一步一步探究其中,伺服器採用的LNMP:
1. 傳送請求。
請求http://test.com:8080/index.php
。
2. 開啟session,並根據php.ini配置儲存session。
- 首先我們在服務端程式碼開啟
Session
(因php.ini
並沒有預設開啟,需程式開啟)// 開啟session session_start(); // 設定session的值,稍後測試給該是否能取出 $_SESSION['name'] = 'phper'; echo 'weclome to session start!';
- 然後檢視
php.ini
中session儲存的路徑,預設檔案儲存的話,儲存路徑為/tmp
,檔名為預設為sess_{session_id}
。主要檢視以下引數引數:session.save_handler = files
- 下來我們登陸伺服器檢視
/tmp
目錄下的檢視該Session檔案。即sess_689u7fiqejt70dujb9uk44eq79
檔案。(此處可能會有疑問,我們是怎麼知道session_id = 689u7fiqejt70dujb9uk44eq79
?再次先埋一處伏筆。)
3. 檢視本次請求,伺服器響應頭攜帶session_id資訊。
檢視響應頭資訊,就是在此處知道了session_id = 689u7fiqejt70dujb9uk44eq79
。因此才會有在步驟2中檢視檔案。其中path=/
指的是cookie儲存瀏覽器的位置。瀏覽器將session_id
儲存在客戶端本地,存在cookie。如下圖所示:
4.再次傳送請求,請求頭攜帶session_id請求服務端
我們只需再次請求http://test.com:8080/index.php
,瀏覽器會在請求頭中攜帶著這個儲存session_id的cookie去請求服務端。我們檢視請求頭中即可看到:
5.校驗session_id來確認客戶端身份
該操作是php的session機制來完成的。我們可以檢測以下看是否能取出剛才設定的$_SESSION['name']
就可驗證。
-
我們修改
index.php
程式碼如下:// 開啟session session_start(); // 設定session的值,稍後測試給該是否能取出 echo $_SESSION['name'];
-
我們再次請求
http://test.com:8080/index.php
,請求頭中以及攜帶著session_id
資訊: -
我們換一個PostMan模擬非法請求看是否能獲取到
$_SESSION['name']
內容?是無法獲取到資訊。 -
嘗試,我們在PostMan中把前面的
cookie=689u7fiqejt70dujb9uk44eq79
攜帶到請求頭看是否能獲取到資訊?是可以獲取到資訊。
以上就是整個請求流程的介紹,我們可以看出來session_id
資訊是非常重要的。有關PHP關於Session的配置項和使用說明
Token時代
web2.0時代的專案都採用 前後端分離。以
Token
這種方式的使用者認證更受大家歡迎。Token
可以解決哪些問題呢?
1.Token 完全由應用管理,所以它可以避開同源策略
2.Token 可以避免 CSRF 攻擊
3.Token 可以是無狀態的,可以在多個服務間共享
有狀態Token
有狀態Token就是將Token的相關屬性(eg:Token過期時間等)記錄在服務端。我們用圖表述頒發token,校驗token,token過期這三個場景。
- 頒發token
- 服務端校驗token
- token過期
無狀態Token
無狀態Token就是將Toekn的相關屬性(eg:Token過期時間等)儲存在Token中,JWT
就是一種無狀態的Token。JWT
這裡不詳細說明,我們主要看下幾個流程:
-
頒發token
-
服務端校驗token
所以,有狀態的Token 與 無狀態的Token 面臨的問題就是 有狀態要佔用伺服器資源並且不利於分散式,微服務等架構。有狀態剛好能解決這個問題,但是無狀態的Token ,不存在Token黑白單這種需求
參考文章:
JWT 超詳細分析
PHP.ini中的session主要配置詳解
本作品採用《CC 協議》,轉載必須註明作者和本文連結