session 與 cookie 是什麼?
session 與 cookie 屬於一種會話控制技術。常用在身分識別,登入驗證,資料傳輸等。舉個例子,就像我們去超市買東西結帳的時候,我們要拿出我們的會員卡才會獲得優惠。這時候,我們要怎麼辨識這個會員卡真實有效的呢?當我們將會員號碼給到收銀員,收銀員根據我們提供的會員號,輸入到系統中,系統根據這個會員號去查詢,如果查詢到了就證明這個會員號是真實存在的。這裡的會員號碼就好比 cookie 與 session. 會員系統就好比伺服器端,收銀員就好比客戶端.
為什麼會用到 session 與 cookie 呢?
根據上述的例子,我們知道 session 與 cookie 是可以做什麼的了,那為什麼必須用這個來實現呢?這裡就有必要了解 http 應用傳輸協定的特點了。由於http 協定是無狀態的,即瀏覽器去請求了一個網頁,這時候就是一個http 請求,當服務端接收到請求之後,返回客戶端需要的數據,在這過程中瀏覽器與伺服器是建立了一個連接的。但是當服務端傳回數據,客戶端收到數據之後,他們的這種連接關係就斷開了。下次瀏覽器再去發送請求的時候,又是重新建立一個連接,這兩個連結沒有任何關係。試想一下,當我們登入一個商場系統的時候,進入首頁做了登錄操作,但是我們下單或者加入購物車的時候,還需要登錄,每訪問一個頁面就要登錄,是不是很繁瑣同時也是很不科學的,萬一我們加入購物車的商品,我們點擊下單了,下單頁面要登錄而且還無法正確的反饋出你下單時的那些商品.
Http 特點
1.http 協定支援客戶端/ 服務端模式,也是一種請求/ 回應模式的協定。
2. 無連線。所謂的無連線就是伺服器收到了客戶端的請求之後,回應完成並收到客戶端的應答之後,即斷開連線。限制每次的連線只處理一次請求。從而節省傳輸時間。
3. 無狀態。 http 協定對事務的處理沒有記憶能力。也意味著如果需要前面的訊息,只能重傳,這無形之中增加資料的傳輸量。這種方式某種方面上講解放了伺服器,但是卻不利於客戶端與伺服器的連線。為了彌補這個不足,產生了兩種記錄 http 狀態的技術,一個叫做 Cookie, 一個叫做 Session,後面我們再細講它們。
4. 簡單快速:所謂的簡單快速是指客戶端向伺服器要求服務時,一般來說只需要傳輸請求方法和路徑,就能進行存取
5. 靈活:這裡主要指的是客戶端可以透過http 協定傳輸任意類型的資料。例如傳輸.jpg 檔案、.ppt 檔案等等,只需要設定 content-type 就可以進行傳輸。
Cookie
cookie 的基本概念
cookie 是遠端瀏覽器儲存資料以此追蹤使用者和識別使用者的機制,從實作來說,cookie 是儲存在客戶端上的資料片段。
cookie 的運作原理與儲存機制
. 運作原理
1. 客戶端向服務端發起一個http 請求.
2. 服務端設定一個建立cookie 的指令,回應給客戶端.
3. 客戶端收到服務端回應的指令,根據指令在客戶端建立一個cookie.
4. 擋下一次請求時,客戶端攜帶這個cookie 向服務端發送請求.
#. 儲存機制
總的來說,cookie 在客戶端儲存的形式有三種,不同的瀏覽器的儲存機制不同,存的cookie 也不同.
1. 檔案儲存。瀏覽器會針對不同的網域,在磁碟的對應目錄建立一個單獨的文件,來儲存該網域下面的 cookie 值.
2. 記憶體儲存。當瀏覽器關閉時,該 cookie 隨之消失。根據下面的建立語法,當我們未設定過期時間時則會出現這種情況.
3.flash 儲存。這種儲存方式是永久儲存在磁碟中,即使透過瀏覽器刪除一些資料都是無法刪除該方式儲存的cookie,如果需要刪除,可能透過磁碟的方式.
cookie 的設置
Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] );
$name:cookie儲存的名稱,必填選項.
$values:cookie儲存的值。這裡要注意的是,當把該值設為false時,客戶端會嘗試刪除這個cookie值,因此在要將值這是為true或false的時候,我們用另外的值來代替,例如true用1代替,false用0來代替.
$expire:cookie的过期时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除cookie.
$path:cookie有效的目录,默认的目录是"/",即表示当前的正个域名都生效.
$domain:cookie的作用域名,默认的是当前域名有效,如果需要设置直接填写生效的域名即可.需要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效.
$secure:cookie的加密处理,当设置为true的时候,需要使用HTTPS协议,才会生效.
$httpOnly:决定cookie是否只使用http协议,当设置为1或者true,其他非http协议是无法操作cookie的。例如我们未设置的时候,我们JavaScript是可以对cookie进行设置的.这样一定程度上保证了安全性.这种情况需考虑浏览器是否支持该配置项.
. 设置 cookie 的函数还有 setrawcookie () 函数,只不过该函数不会对值 进行 urlencode 序列号.
.ac48bac2b8b96521dcd0023c5193ba8e 有时候,我们可能遇到这种情况,我们在这个页面设置了 cookie,但是去刷新页面获取 cookie,按理说是会获取到 cookie 的,但实际情况是无法获取到,这是由于 cookie 运行机制导致,PHP 创建了 cookie 这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到 cookie 的.
. 在设置 cookie 之前,不能有任何输出.
// 实现方式一 setcookie($cookie,"hello,world!", 3600); // 实现方式二 header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));"); // 两则的作用是一样的,setcookie是PHP内置函数,是对http协议的操作封装。
cookie 的获取
$_COOKIE['$cookeName'];
cookie 的应用
. 用户身份识别
. 数据传输
. 登录控制 (是否登录、单点登录)
cookie 跨域设置
我们都知道,在前端开发中时常会遇到 ajax 跨域问题,我们解决的方式有很多种,可以参考这篇文章传送门 1,传送门 2,cookie 跨域我们可以参考 p3p 传输协议传送门
cookie 使用的注意事项
. 数量限制,客户端对每一个 domian 下的 cookie 是有数量限制的,不是创建任意数量就行.
. 安全性,根据上面的创建语法,我们可以得知,当我们未设置 $httpOnly 值得时候,非 http 协议是可以操作 cookie 的值的,例如 JavaScript 通过 cookie ($cookieName). 而且一些抓包工具也是可以抓取到 cookie 的,还有就是 cookie 存储在客户端的文件中,如果获取到这个 cookie,也是可以对 cookie 做一些操作的。为了防止别人可以拷贝 cookie 文件,进行恶意操作,可以对 cookie 进行加密处理.
数据传输:当 cookie 数量很多,数据很大的时候,其实对于带宽是有消耗的。比较 http 传输都需要带宽,当 http 传输的数据量大了,带了的带宽消耗就大.
Session
运行原理与存储机制
. 运行原理
1. 客户端向服务端发起请求,建立通信
2. 服务端根据设置的 session 创建指令,在服务端创建一个编号为 sessionid 的文件,里面的值就是 session 具体的值 (组成部分 变量名 | 类型 : 长度:值).
3. 服务端将创建好的 sessionid 编号响应给客户端,客户则将该编号存在 cookie 中 (一般我们在浏览器存储的调试栏中会发现 cookie 中有一个 PHPSESSID 的键,这就是 sessionid,当然这个名称,我可以通过设置服务端是可以改变的).
. 当下一次请求时,客户端将这个 sessionid 携带在请求中,发送给服务端,服务端根据这个 sessionid 来做一些业务判断.
. 存储机制
1. 存储方式.session 默认是文件存储的。我们可以通过 php.ini 的配置来设置存储驱动传送门
2. 生命周期。当我们未设置 session 的生命周期时,当浏览器关闭之后存储在客户端的 phpsessid 自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个 phpsessid. 之前的 session,PHP 会自动的根据垃圾回收机制自动删除。这里我们可以根据 session_set_cookie_params ($expire) 函数来设置一个生命周期;
session 的设置
session_start(); $_SESSION = $values;
. session_start () 设置之前,不能有任何输出
session 的获取
$_SESSION['values'];
session 的删除
// 只是单纯的给重新赋了一个空的值 $_SESSION['values'] = ''; // 该函数是清空所有的session,慎用! session_destroy(); // 连values这个session键都会删除 unset($_SESSION['values']);
session 的使用场景
. 用户身份识别
. 数据传输
. 登录控制 (是否登录、单点登录)
session 的注意事项
. 安全性,sessionid 是按照一定的算法生成,要保证 session 的值唯一性和随机性.
. 用戶端停用cookie,根據上面session 的運作原理可以得出,session 的儲存於傳送還是依賴於客戶端,因此當客戶端停用cookie 時,客戶端是無法保存PHPSESSID 的,這時候可以透過url 重寫或表單來實現session 的傳輸.
. 儲存優化,按照上面的session 創建,所有的session 都會創建在一個目錄下面,同時有的無效session 在垃圾回收機制時間內還不會刪除,當一台伺服器配置的站點較多時,這時候會產生很多的session 文件,導致我們讀取速度變慢,我們可以設置session 的存儲目錄級別,save_path 函數. 一般大型的項目(如分佈式的項目), 可以使用其他的存儲方式,如數據存儲,內存存儲.
session 與cookie 的區別
. session 存儲在服務端,cookie 存儲在客戶端.
.cookie 的建立指令由服務端設定.
.session 的sessionid 需要客戶端儲存.
cookie 與session 的幾個誤區
. 用戶端禁止cookie,session 無法使用?
使用url重寫或表單提交可以實現.
.session 和 cookie 的安全性比較,session 存在客戶端安全性更高?
由於cookie是存在客戶端的,相對來說安全性是要低一些,不過在創建的時候可以設定$httpOnly值.
由於cookie與session是相互關聯的,獲取到cookie一定程度上取得到了session,同樣可以操作session.
.cookie 與session 是不是在瀏覽器關閉的時候會消失?
這需要查看儲存機制了。 cookie可以存文件,內存,flash.存內存當然瀏覽器關閉則消失了;session由於垃圾回收機制,當在垃圾回收機制內是不會刪除的,除非你代碼中顯示的做了刪除操作.
.cookie 是儲存在客戶端中,如何增加其安全性?
我們可以在設定cookie的時候,增加一些特殊參數,如客戶端資訊ip、瀏覽器資訊等.
. 當cookie 存在客戶端的檔案中,是不是每個瀏覽器取得到這個檔案都可以進行操作?
要看瀏覽器之間對cookie的管理機制是不是一樣.
相關推薦:《PHP教學》
以上是PHP 不得不提起的 session 與 cookie的詳細內容。更多資訊請關注PHP中文網其他相關文章!