簡聊 Session 與 Token 身份驗證

前言
當我們賬號密碼登陸以後,如何確保用戶認證是我們每一個 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 主要配置詳解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章