iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
1
tags: 2019鐵人賽 PHP session

前言

昨天完成了我們第一個 CRUD,我也提到我們缺少了會員登入的機制,接下我們就嘗試來實作看看。

在這之前,我們先想想要怎麼做,概念很簡單:

  1. 會員輸入帳號密碼
  2. 伺服器端驗證帳號密碼是否正確
  3. 驗證通過就找個地方記錄會員已經登入了

那儲存的地方在哪?可以放在資料庫也可以利用 Session,那們什麼是 Session 呢?我們來探討看看

為什麼要有 Session

首先大家要知道,HTTP 協議本身是一種「無狀態協議」,什麼是無狀態協議?

大家可以想像去便利商店買東西的流程:客戶進門>>挑選商品>>櫃檯結帳>>拿走商品出門。便利商店就是伺服器端,客戶就是使用端,伺服器端重頭到尾都不用知道是誰進來,只要有付錢而且價格跟商品定價一樣,就可以帶走商品。

所以當這個便利商店升級成 COSTCO,以後進出都採會員制,我總不可能每次都要客戶進出都拿身份證驗明真身才給進去吧,所以這時候會員卡的機制油然而生。

而網站伺服器中會員卡就是 session,也就是為了避免使用者反覆輸入帳號、密碼而產生的機制。

Session vs Cookie

會談(session)和餅乾(cookie)的差異

Session 一直到 PHP4 之後才有的,PHP3(含)以前幾乎都是使用 Cookie 來記錄一些資訊,然而 Session 的出現,對於 PHP 的安全性有很大的提升,同時也讓網站功能更全面。

PHP Session 與 Cookie 的比較

  • Session:儲存於伺服器端,不用擔心用戶禁用 session 的問題,但記錄檔案的負荷由伺服器承擔。
  • Cookie:儲存於用戶端,可能有用戶端禁用 cookie,但伺服器不需承擔記錄檔案的負荷。

各有優缺點,所以並沒有完全捨棄 cookie 的問題存在,有些不重要的資料其實用 cookie 儲存就可以了,降低一些伺服器的負荷;但是重要的資訊,像是用戶的登入帳號等,使用 session 相對比較安全,但也僅僅是「相對」安全而已。

至於為什麼呢?大家可以想像一下,session 就像上面提到的會員卡,使用者只要填寫資料(輸入帳號、密碼)加入會員,就可以換一張會員卡,以後進出商店都拿會員卡認證就可以自由進出,那萬一會員卡被別人拿走了呢?是不是「他」就可以取代你自由進出商店了。

至於「會員卡」是怎麼被拿走的,不在我這次的討論範圍,那跟網路安全防護有關,我只是一個小小新手,這個問題就留給大家自己去找了。

拿餅乾換會談?

對!沒錯,cookie 和 session 其實是相輔相成的。

我們再來想像一個情境

  1. 使用者A、使用者B各自輸入帳號、密碼
  2. 伺服器驗證A、B的帳號、密碼都成功
  3. 伺服器儲存了一個 session A,一個 session B
  4. 使用者A再送出一個網路請求

問題來了:伺服器要怎麼知道是哪個使用者送出來的請求?

答案就是 cookie,因為在伺服器授權成功的時候,伺服器就會自動派發一個 session ID 給這次的連線動作。以後只要判別使用端 cookie 中夾帶這個 session ID,伺服器就可以知道誰是誰了。

PHP 中 Session 的數據儲存在哪裡呢?

當然是在伺服器端,但不是保存在內存中,而是儲存在文件或資料庫中。

默認情況下,PHP.ini 中設置的 session 保存方式是 files (session.save_handler = files),而儲存的目錄由 session.save_path 指定,檔案名以 sess_ 為前綴,後面則是 Session ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。

如果訪問量大,可能產生的 session 文件會比較多,這時可以設置分級目錄進行 session 檔案的儲存,設置方法為:session.save_path="N;/save_path",N為分級的級數,save_path 為儲存路徑。

當寫入 session 數據的時候,PHP 會獲取到客戶端的 session ID,然後根據這個 session ID 到指定的路徑中找到相對應的 session 檔案,若是檔案不存在則創建之,最後將數據序列化之後寫入檔案。

後記

今天的文章有點冗長,也沒有圖片,但是希望這些整理有助於大家瞭解 seesion 存在的目的不僅僅是把使用者資料存在伺服器端這麼簡單而已。


上一篇
Day 15 - 實作第一個 CRUD 之 Create、Update、Delete
下一篇
Day 17 - 會員登入系統
系列文
新手後端工程師的學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言