溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Session與Token身份驗證怎么實現(xiàn)

發(fā)布時間:2021-12-17 10:14:09 來源:億速云 閱讀:219 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Session與Token身份驗證怎么實現(xiàn)”,在日常操作中,相信很多人在Session與Token身份驗證怎么實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Session與Token身份驗證怎么實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

當我們賬號密碼登陸以后,如何確保用戶認證是我們每一個 phper 都會遇到的問題,從最開始的 Session 到 Token ,讓我們帶著求知欲了解一下它。

Session 時代

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

Session與Token身份驗證怎么實現(xiàn)

1. 發(fā)送請求。

請求 http://test.com:8080/index.php。

2. 開啟 session,并根據(jù) php.ini 配置保存 session。

首先我們在服務端代碼開啟 Session (因 php.ini 并沒有默認開啟,需程序開啟)

// 開啟sessionsession_start();// 設置session的值,稍后測試給該是否能取出$_SESSION['name'] = 'phper';echo 'weclome to session start!';
然后查看 php.ini 中 session 保存的路徑,默認文件保存的話,保存路徑為 /tmp,文件名為默認為  sess_{session_id}。主要查看以下參數(shù)參數(shù):  session.save_handler = files

下來我們登陸服務器查看  /tmp 目錄下的查看該 Session 文件。

即    sess_689u7fiqejt70dujb9uk44eq79   文件。  (此處可能會有疑問,我們是怎么知道    session_id = 689u7fiqejt70dujb9uk44eq79  ? 再次先埋一處伏筆。  )

Session與Token身份驗證怎么實現(xiàn)

3. 查看本次請求,服務器響應頭攜帶 session_id 信息。

Session與Token身份驗證怎么實現(xiàn)

查看響應頭信息,就是在此處知道了 session_id = 689u7fiqejt70dujb9uk44eq79。因此才會有在步驟 2 中查看文件。

其中 path=/ 指的是 cookie 儲存瀏覽器的位置。

瀏覽器將 session_id 保存在客戶端本地,存在 cookie。如下圖所示:

Session與Token身份驗證怎么實現(xiàn)

4. 再次發(fā)送請求,請求頭攜帶 session_id 請求服務端

我們只需再次請求 http://test.com:8080/index.php,瀏覽器會在請求頭中攜帶著這個保存 session_id 的 cookie 去請求服務端。我們查看請求頭中即可看到:

Session與Token身份驗證怎么實現(xiàn)

5. 校驗 session_id 來確認客戶端身份

該操作是 php 的 session 機制來完成的。我們可以檢測以下看是否能取出剛才設置的 $_SESSION['name'] 就可驗證。

我們修改 index.php 代碼如下:

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

Session與Token身份驗證怎么實現(xiàn)

我們換一個 PostMan 模擬非法請求看是否能獲取到 $_SESSION['name'] 內(nèi)容?是無法獲取到信息。

Session與Token身份驗證怎么實現(xiàn)

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

Session與Token身份驗證怎么實現(xiàn)

以上就是整個請求流程的介紹,我們可以看出來 session_id 信息是非常重要的。有關(guān) PHP 關(guān)于 Session 的配置項和使用說明

Token 時代

web2.0 時代的項目都采用 前后端分離。以 Token 這種方式的用戶認證更受大家歡迎。Token 可以解決哪些問題呢?

1.Token 完全由應用管理,所以它可以避開同源策略

2.Token 可以避免 CSRF 攻擊

3.Token 可以是無狀態(tài)的,可以在多個服務間共享

有狀態(tài) Token

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

  1. 頒發(fā) token


    Session與Token身份驗證怎么實現(xiàn)

  2. 服務端校驗 token


    Session與Token身份驗證怎么實現(xiàn)

  3. token 過期

Session與Token身份驗證怎么實現(xiàn)

無狀態(tài) Token

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

  1. 頒發(fā) token

    Session與Token身份驗證怎么實現(xiàn)

  2. 服務端校驗 token

Session與Token身份驗證怎么實現(xiàn)

所以,有狀態(tài)的 Token 與 無狀態(tài)的 Token 面臨的問題就是 有狀態(tài)要占用服務器資源并且不利于分布式,微服務等架構(gòu)。有狀態(tài)剛好能解決這個問題,但是無狀態(tài)的 Token ,不存在 Token 黑白單這種需求

到此,關(guān)于“Session與Token身份驗證怎么實現(xiàn)”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI