>백엔드 개발 >PHP 튜토리얼 >PHP 세션 제어 세션 및 쿠키

PHP 세션 제어 세션 및 쿠키

WBOY
WBOY원래의
2016-08-08 09:20:041032검색

쿠키 소개

쿠키는 사용자의 데이터를 추적하고 저장하기 위해 쿠키를 사용합니다. 일반적으로 쿠키는 HTTP 헤더를 통해 서버에서 클라이언트로 반환됩니다. 대부분의 웹 프로그램은 쿠키 동작을 지원합니다. 쿠키는 HTTP 헤더에 존재하기 때문에 헤더 기능의 사용 제한과 마찬가지로 다른 정보가 출력되기 전에 쿠키를 설정해야 합니다.

PHP는 setcookie 함수를 통해 쿠키를 설정합니다. 브라우저에서 다시 전송된 모든 쿠키는 PHP에 의해 $_COOKIE의 전역 변수에 자동으로 저장되므로 $_COOKIE['key' ]를 사용하여 쿠키를 읽을 수 있습니다. 값.

PHP의 쿠키는 널리 사용되며 사용자의 로그인 정보, 장바구니 등을 저장하는 데 자주 사용됩니다. 세션을 사용할 때 쿠키는 일반적으로 사용자를 식별하기 위해 세션 ID를 저장하는 데 사용됩니다. .유효기간이 만료되면 쿠키는 클라이언트에서 자동으로 삭제됩니다. 동시에 쿠키는 보안 제어를 위해 도메인과 경로를 설정할 수도 있습니다. 이에 대해서는 이후 장에서 자세히 설명하겠습니다.

쿠키 설정

PHP에서 쿠키를 설정하는 가장 일반적인 방법은 setcookie 함수를 사용하는 것입니다. setcookie에는 7개의 선택적 매개변수가 있으며, 우리가 일반적으로 사용하는 처음 5개는 다음과 같습니다. :

name(쿠키 이름)은 $_COOKIE['name']을 통해 액세스할 수 있습니다.
value(쿠키 값)
expire(만료 시간) Unix 타임스탬프 형식, 기본값은 0으로, 브라우저를 닫으면 유효하지 않습니다
경로(유효 경로) 경로를 '/'로 설정하면 전체 웹 사이트가 유효합니다
domain(유효 도메인) 기본적으로 'www.imooc.com'이 설정된 경우 www 하위 도메인

$value = 'test'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); //有效期一小时 setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域 PHP에는 쿠키를 설정하는 setrawcookie 함수도 있습니다. setrawcookie는 기본적으로 setcookie와 동일합니다. 유일한 차이점은 값이 자동으로 urlencode되지 않으므로 필요할 때 urlencode를 수동으로 수행해야 한다는 것입니다.

setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365); 쿠키는 HTTP 헤더를 통해 설정되기 때문에 헤더 방식을 사용하여 직접 설정할 수도 있습니다.

header("Set-Cookie:cookie_name=value");쿠키 삭제 및 만료 시간

이전 장을 통해 쿠키 설정 기능에 대해 알아보았는데, PHP에는 쿠키를 삭제하는 기능이 없습니다. PHP에서 쿠키를 삭제하는 것도 setcookie 함수를 사용하여 수행됩니다.

setcookie('test', '', time()-1); 쿠키의 만료 시간을 현재 시간 이전으로 설정하면 쿠키가 자동으로 만료되어 쿠키 삭제 목적이 달성되는 것을 볼 수 있습니다. 이러한 설계의 이유는 쿠키가 HTTP 헤더를 통해 전달되기 때문입니다. 클라이언트는 서버에서 반환된 Set-Cookie 세그먼트를 기반으로 쿠키를 설정합니다. 쿠키를 삭제하려면 새로운 Del-Cookie를 사용해야 합니다. 사실, 쿠키의 설정, 업데이트, 삭제는 Set-Cookie를 통해 간단하고 명확하게 이루어질 수 있습니다.

원칙을 이해한 후 헤더를 통해 직접 쿠키를 삭제할 수도 있습니다.

header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));여기서 gmdate는 그리니치 표준시를 생성하여 시차의 영향을 제거하는 데 사용됩니다.

쿠키의 유효한 경로

쿠키의 경로는 설정된 쿠키가 유효한 경로를 제어하는 ​​데 사용됩니다. 는 '/'이며, 다른 경로를 설정한 경우에는 설정된 경로와 하위 경로에서만 유효합니다. 예:

setcookie('test', time(), 0, '/path');위 설정은 테스트를 수행합니다. /path 및 하위 경로. /path/abc 경로에서는 유효하지만 루트 디렉터리에서는 test의 쿠키 값을 읽을 수 없습니다.

일반적인 상황에서는 대부분의 경로가 사용됩니다. 특별한 요구가 있는 경우에만 경로가 설정됩니다. 이 경우 쿠키 값은 지정된 경로에서만 전달됩니다. 데이터 전송을 절약하고 보안을 강화하며 성능을 향상시킬 수 있습니다.

유효한 경로를 설정하면 현재 경로에 없으면 현재 쿠키를 볼 수 없습니다.

setcookie('test', '1',0, '/path'); var_dump($_COOKIE['test']); 세션과 쿠키의 유사점과 차이점

쿠키는 클라이언트에 데이터를 저장하고 사용자와 서버를 연결하는 역할을 합니다. . 일반적으로 많은 문제를 해결할 수 있지만 쿠키에는 여전히 몇 가지 제한 사항이 있습니다.

쿠키는 상대적으로 안전하지 않으며 쉽게 도난당할 수 있어 쿠키 스푸핑으로 이어질 수 있습니다.

단일 쿠키의 가치는 저장될 수만 있습니다. ~ 4k
요청마다 네트워크 전송을 위해 대역폭을 점유합니다

session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。

使用session

在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。

session_start(); $_SESSION['test'] = time(); var_dump($_SESSION);

session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。

session_start(); $_SESSION['ary'] = array('name' => 'jobs'); $_SESSION['obj'] = new stdClass(); var_dump($_SESSION);

默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题。

删除与销毁session

删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。

session_start(); $_SESSION['name'] = 'jobs'; unset($_SESSION['name']); echo $_SESSION['name']; //提示name不存在

如果要删除所有的session,可以使用session_destroy函数销毁当前session,session_destroy会删除所有数据,但是session_id仍然存在。

session_start(); $_SESSION['name'] = 'jobs'; $_SESSION['time'] = time(); session_destroy();

值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。

session_start(); $_SESSION['name'] = 'jobs'; $_SESSION['time'] = time(); unset($_SESSION); session_destroy(); var_dump($_SESSION); //此时已为空

如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除session_id的cookie值。

使用session来存储用户的登录信息

session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。

用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。

$_SESSION['uid'] = $userinfo['uid']; $_SESSION['userinfo'] = $userinfo;

一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。

session_start();
//假设用户登录成功获得了以下用户数据
$userinfo = array(
'uid' => 10000,
    'name' => 'spark',
    'email' => 'spark@imooc.com',
    'sex'  => 'man',
    'age'  => '18'
);
header("content-type:text/html; charset=utf-8");
/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
echo "welcome ".$_SESSION['name'] . '
';
//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
echo "用户信息加密前:".$str;
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secureKey, $str, MCRYPT_MODE_ECB));
echo "用户信息加密后:".$str;
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secureKey, base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:
";
var_dump($uinfo);

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了php会话控制session&cookie,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.