簡聊 Session 與 Token 身份驗證

悲劇不上演發表於2018-12-24

當我們賬號密碼登陸以後,如何確保使用者認證是我們每一個phper都會遇到的問題,從最開始的SessionToken ,讓我們帶著求知慾瞭解一下它。


Session時代

Web開發使用Http協議,HTTP協議最初是匿名的,無狀態的請求/響應協議。這樣簡單的設計可以使HTTP協議專注於資源的傳輸(HTTP是超文字傳輸協議);隨著WEB的發展,業務需要確定客戶端的唯一性,引入session會話這個概念 。PHP設定session 整個過程如下,我們一步一步探究其中,伺服器採用的LNMP
file

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?再次先埋一處伏筆。)
    file

3. 檢視本次請求,伺服器響應頭攜帶session_id資訊。
file
檢視響應頭資訊,就是在此處知道了session_id = 689u7fiqejt70dujb9uk44eq79。因此才會有在步驟2中檢視檔案。其中path=/指的是cookie儲存瀏覽器的位置。瀏覽器將session_id儲存在客戶端本地,存在cookie。如下圖所示:
file

4.再次傳送請求,請求頭攜帶session_id請求服務端
我們只需再次請求http://test.com:8080/index.php,瀏覽器會在請求頭中攜帶著這個儲存session_id的cookie去請求服務端。我們檢視請求頭中即可看到:
file
5.校驗session_id來確認客戶端身份
該操作是php的session機制來完成的。我們可以檢測以下看是否能取出剛才設定的$_SESSION['name']就可驗證。

  • 我們修改index.php程式碼如下:

    // 開啟session
    session_start();
    // 設定session的值,稍後測試給該是否能取出
    echo $_SESSION['name'];
  • 我們再次請求http://test.com:8080/index.php,請求頭中以及攜帶著session_id資訊:
    file

  • 我們換一個PostMan模擬非法請求看是否能獲取到$_SESSION['name']內容?是無法獲取到資訊
    file

  • 嘗試,我們在PostMan中把前面的cookie=689u7fiqejt70dujb9uk44eq79攜帶到請求頭看是否能獲取到資訊?是可以獲取到資訊
    file


以上就是整個請求流程的介紹,我們可以看出來session_id資訊是非常重要的。有關PHP關於Session的配置項和使用說明


Token時代

web2.0時代的專案都採用 前後端分離。以Token這種方式的使用者認證更受大家歡迎。Token可以解決哪些問題呢?
1.Token 完全由應用管理,所以它可以避開同源策略
2.Token 可以避免 CSRF 攻擊
3.Token 可以是無狀態的,可以在多個服務間共享

有狀態Token

有狀態Token就是將Token的相關屬性(eg:Token過期時間等)記錄在服務端。我們用圖表述頒發token,校驗token,token過期這三個場景。

  1. 頒發token
    file
  2. 服務端校驗token
    file
  3. token過期
    file

無狀態Token

無狀態Token就是將Toekn的相關屬性(eg:Token過期時間等)儲存在Token中,JWT就是一種無狀態的Token。JWT這裡不詳細說明,我們主要看下幾個流程:

  1. 頒發token
    file

  2. 服務端校驗token
    file

所以,有狀態的Token 與 無狀態的Token 面臨的問題就是 有狀態要佔用伺服器資源並且不利於分散式,微服務等架構。有狀態剛好能解決這個問題,但是無狀態的Token ,不存在Token黑白單這種需求


參考文章:
JWT 超詳細分析
PHP.ini中的session主要配置詳解

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章