2019鐵人賽
PHP
session
昨天完成了我們第一個 CRUD,我也提到我們缺少了會員登入的機制,接下我們就嘗試來實作看看。
在這之前,我們先想想要怎麼做,概念很簡單:
那儲存的地方在哪?可以放在資料庫也可以利用 Session,那們什麼是 Session 呢?我們來探討看看
首先大家要知道,HTTP 協議本身是一種「無狀態協議」,什麼是無狀態協議?
大家可以想像去便利商店買東西的流程:客戶進門>>挑選商品>>櫃檯結帳>>拿走商品出門。便利商店就是伺服器端,客戶就是使用端,伺服器端重頭到尾都不用知道是誰進來,只要有付錢而且價格跟商品定價一樣,就可以帶走商品。
所以當這個便利商店升級成 COSTCO,以後進出都採會員制,我總不可能每次都要客戶進出都拿身份證驗明真身才給進去吧,所以這時候會員卡的機制油然而生。
而網站伺服器中會員卡就是 session,也就是為了避免使用者反覆輸入帳號、密碼而產生的機制。
Session 一直到 PHP4 之後才有的,PHP3(含)以前幾乎都是使用 Cookie 來記錄一些資訊,然而 Session 的出現,對於 PHP 的安全性有很大的提升,同時也讓網站功能更全面。
PHP Session 與 Cookie 的比較
各有優缺點,所以並沒有完全捨棄 cookie 的問題存在,有些不重要的資料其實用 cookie 儲存就可以了,降低一些伺服器的負荷;但是重要的資訊,像是用戶的登入帳號等,使用 session 相對比較安全,但也僅僅是「相對」安全而已。
至於為什麼呢?大家可以想像一下,session 就像上面提到的會員卡,使用者只要填寫資料(輸入帳號、密碼)加入會員,就可以換一張會員卡,以後進出商店都拿會員卡認證就可以自由進出,那萬一會員卡被別人拿走了呢?是不是「他」就可以取代你自由進出商店了。
至於「會員卡」是怎麼被拿走的,不在我這次的討論範圍,那跟網路安全防護有關,我只是一個小小新手,這個問題就留給大家自己去找了。
對!沒錯,cookie 和 session 其實是相輔相成的。
我們再來想像一個情境
問題來了:伺服器要怎麼知道是哪個使用者送出來的請求?
答案就是 cookie,因為在伺服器授權成功的時候,伺服器就會自動派發一個 session ID 給這次的連線動作。以後只要判別使用端 cookie 中夾帶這個 session ID,伺服器就可以知道誰是誰了。
當然是在伺服器端,但不是保存在內存中,而是儲存在文件或資料庫中。
默認情況下,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 存在的目的不僅僅是把使用者資料存在伺服器端這麼簡單而已。