쿠키 및 세션에 대한 동적 웹 페이지 기술 PHP 분석
저자:Eve Cole
업데이트 시간:2009-06-06 18:16:01
1. PHP 쿠키
쿠키는 사용자를 추적하고 식별하기 위해 원격 브라우저에 데이터를 저장하는 메커니즘입니다.
PHP는 http 프로토콜의 헤더 정보에 쿠키를 보내기 때문에 브라우저에 다른 정보를 출력하기 전에 setcookie() 함수를 호출해야 하는데, 이는 header() 함수에 대한 제한과 유사합니다.
1.1 쿠키 설정:
쿠키는 setcookie() 또는 setrawcookie() 함수를 사용하여 설정할 수 있습니다. 또한 http 헤더를 클라이언트에 직접 전송하여 설정할 수도 있습니다.
1.1.1 쿠키를 설정하려면 setcookie() 함수를 사용하십시오.
bool setcookie ( 문자열 이름 [, 문자열 값 [, int 만료 [, 문자열 경로 [, 문자열 도메인 [, bool secure [, bool httponly]]]]]] )
이름: 쿠키 변수 이름
value: 쿠키 변수의 값
만료: 유효 기간이 종료되는 시간,
경로: 유효한 디렉터리,
도메인: 유효한 도메인 이름, 고유한 최상위 도메인
secure: 값이 1이면 쿠키는 https 연결에서만 유효하고, 기본값이 0이면 http와 https가 모두 유효합니다.
예:
<?php
$value = '어딘가에서 온 것';
setcookie("TestCookie", $value) /* 간단한 쿠키 설정*/
setcookie("TestCookie", $value, time()+3600) /* 유효기간은 1시간입니다*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1) /* 유효한 디렉토리/~rasmus, 유효한 도메인 이름 example.com 및 모든 하위 도메인 */
?>
여러 쿠키 변수 설정: setcookie('var[a]','value'); 배열을 사용하여 변수를 나타내지만 해당 첨자에는 따옴표가 필요하지 않습니다. 이 방법으로 $_COOKIE['var'][를 사용할 수 있습니다. 'a'] COOKIE 변수를 읽습니다.
1.1.2. 쿠키를 설정하려면 header()를 사용하세요.
header("쿠키 설정: 이름=$value[;path=$path[;domain=xxx.com[;...]]");
다음 매개변수는 setcookie 함수에 대해 위에 나열된 매개변수와 동일합니다.
예를 들어:
$value = '어딘가에서 온 것';
header("Set-Cookie:name=$value");
1.2 쿠키 읽기:
PHP에 내장된 슈퍼 전역 변수 $_COOKIE를 직접 사용하여 브라우저 측에서 쿠키를 읽을 수 있습니다.
위의 예에서는 "TestCookie" 쿠키가 설정되었습니다. 이제 읽어보겠습니다.
인쇄 $_COOKIE['TestCookie'];
COOKIE가 내보내졌나요?!
1.3 쿠키 삭제
유효한 시간을 현재 시간보다 작게 설정하고 값을 비워두세요. 예를 들면 다음과 같습니다.
setcookie("이름","",time()-1);
header()를 사용하는 것과 유사합니다.
1.4 일반적인 문제 해결:
1) setcookie()를 사용할 때 오류 메시지가 나타납니다. setcookie()를 호출하기 전에 출력이나 공백이 있기 때문일 수도 있습니다. 또한 문서가 다른 문자 세트에서 변환되었거나 문서에 BOM 서명이 있을 수도 있습니다. (즉, 숨겨진 BOM 문자를 파일 내용에 추가하는 것입니다.) 해결책은 ob_start() 함수를 사용하여 이러한 상황을 방지하는 것입니다.
2) $_COOKIE는 Magic_quotes_gpc의 영향을 받으며 자동으로 이스케이프될 수 있습니다.
3) 사용 시, 이용자의 쿠키 지원 여부를 테스트할 필요가 있습니다.
<!--[if !supportLineBreakNewLine]-->
1.5 쿠키 작동 메커니즘:
일부 학습자는 충동적이고 원리를 공부할 시간이 없으므로 나중에 넣습니다.
a) 서버는 응답과 함께 http Set-Cookie 헤더를 전송하여 클라이언트에 쿠키를 설정합니다(여러 쿠키에는 여러 헤더가 필요함).
b) 클라이언트는 자동으로 http 쿠키 헤더를 서버에 보내고 서버는 이를 수신하여 읽습니다.
HTTP/1.x 200 확인
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=어딘가의 무언가 경로=/
만료: 2007년 11월 19일 목요일 18:52:00 GMT
캐시 제어: 저장 안 함, 캐시 안 함, 재검증 필수, 사후 확인=0, 사전 확인=0
Pragma: 캐시 없음
콘텐츠 유형: 텍스트/html
이 줄은 이 줄을 받은 후 쿠키 기능을 구현합니다.
Set-Cookie: TestCookie=어딘가의 무언가 경로=/
브라우저는 클라이언트 디스크에 쿠키 파일을 생성하고 다음을 씁니다.
TestCookie=어딘가에서 온 것;
/
이 줄은 setcookie('TestCookie','something from someone','/');를 사용한 결과입니다. 또한 header('Set-Cookie: TestCookie=something from someone; path=/')를 사용한 결과이기도 합니다. ;.
<!--[endif]-->
2. PHP 세션
세션은 만료 시간이 0으로 설정된 쿠키를 사용하고 세션 ID(긴 문자열)라는 고유 식별자를 사용하여 서버 측의 일부 세션 파일을 동기화하고(세션 저장 유형은 직접 정의할 수 있음) 다음과 통신합니다. 사용자가 연결되었습니다. 웹 애플리케이션은 이러한 세션과 관련된 데이터를 저장하고 해당 데이터가 사용자와 페이지 간에 전달될 수 있도록 합니다.
웹사이트 방문자에게는 소위 세션 ID라는 고유 식별자가 할당됩니다. 이는 클라이언트측 쿠키에 저장되거나 URL을 통해 전달됩니다.
세션 지원을 통해 사용자는 원하는 만큼의 변수를 등록하고 각 요청에 대해 예약할 수 있습니다. 방문자가 웹 사이트에 액세스하면 PHP는 요청에 특정 세션 ID가 자동으로 전송되었는지(session.auto_start가 1로 설정된 경우) 또는 사용자가 요청할 때(session_start()에 의해 명시적으로 호출되거나 session_register(에 의해 암시적으로 호출) 확인됩니다. )). 그렇다면 이전에 저장된 환경이 다시 생성됩니다.
2.1 sessionID 전송
2.1.1 쿠키를 통해 sessin ID 전송
session_start()를 사용하여 세션을 호출합니다. 세션 파일을 생성하는 동안 서버는 세션 ID 해시 값과 세션 이름을 기본값인 PHPSESSID로 생성하고 변수를 클라이언트에 보냅니다(기본값은 세션 이름). ), 값은 128비트 해시 값입니다. 서버는 이 쿠키를 통해 클라이언트와 상호 작용합니다.
세션 변수의 값은 PHP에 의해 내부적으로 직렬화되어 서버 시스템의 텍스트 파일에 저장되며 기본적으로 변수 이름이 PHPSESSID인 클라이언트의 쿨리와 상호 작용합니다.
즉, 서버는 자동으로 http 헤더를 보냅니다: header('Set-Cookie: session_name()=session_id(); path=/');
즉, setcookie(session_name(),session_id());
이 페이지에서 새 페이지로 이동하고 session_start()를 호출하면 PHP는 지정된 ID와 관련된 서버 측 저장된 세션 데이터를 확인합니다. 찾을 수 없는 경우 새 데이터 세트가 생성됩니다.
2.1.2 URL을 통해 세션 ID 전송
이 방법은 브라우저 쿠키가 이미 보편적이고 보안상의 이유로 필요하지 않기 때문에 사용자가 쿠키 사용을 금지하는 경우에만 사용됩니다.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, 세션 값은 POST를 통해서도 전달될 수 있습니다.
2.2 세션의 기본 사용 예
<?php
// 페이지1.php
세션_시작();
echo '#1 페이지에 오신 것을 환영합니다';
/* 세션 변수를 생성하고 세션 변수에 값을 할당 */
$_SESSION['favcolor'] = '녹색';
$_SESSION['animal'] = '고양이';
$_SESSION['시간'] = 시간();
// 클라이언트가 쿠키를 사용하는 경우 세션을 page2.php로 직접 전달할 수 있습니다.
echo '<br /><a href="page2.php">2페이지</a>';
// 클라이언트가 쿠키를 비활성화한 경우
echo '<br /><a href="page2.php?' . SID . '">페이지 2</a>';
/*
기본적으로 php5.2.1에서 SID는 세션이 기록될 때만 값을 갖습니다.
해당 쿠키가 이미 존재하는 경우 SID는 (정의되지 않음) 비어 있습니다.
*/
?>
<?php
// 페이지2.php
세션_시작();
print $_SESSION['animal']; // 단일 세션을 인쇄합니다.
var_dump($_SESSION); // page1.php가 전달한 세션 값을 출력합니다.
?>
2.3 세션 기능을 사용하여 페이지 캐싱을 제어합니다.
대부분의 경우 웹페이지가 클라이언트에 캐시되어 있는지 확인하거나 캐시 유효 시간을 설정해야 합니다. 예를 들어 웹페이지에 민감한 콘텐츠가 있고 이를 보려면 로그인해야 합니다. , 로그인하지 않고도 로컬 캐시를 직접 열 수 있습니다.
session_cache_limiter('private')를 사용하여 session_start() 전에 호출되어야 하는 페이지 클라이언트 캐시를 제어합니다.
더 많은 매개변수를 보려면 http://blog.chinaunix.net/u/27731/showart.php?id=258087 에서 클라이언트 캐시 제어를 참조하세요.
클라이언트 캐시 시간을 제어하려면 session_cache_expire(int) 단위(들)도 session_start() 전에 호출해야 합니다.
이는 세션을 사용할 때 캐싱을 제어하는 방법일 뿐입니다. header()에서도 페이지 캐싱을 제어할 수 있습니다.
2.4 세션 삭제
이를 달성하려면 세 단계가 필요합니다.
<?php
session_destroy(); // 첫 번째 단계: 서버 측 세션 파일을 삭제합니다.
setcookie(session_name(),'',time()-3600); // 2단계: 실제 세션 삭제:
$_SESSION = array(); // 3단계: $_SESSION 전역 변수 배열 삭제
?>
2.5 PHP 대규모 웹 애플리케이션에서 세션 사용 방문 횟수가 많은 사이트의 경우 현재 가장 좋은 방법은 데이터베이스를 사용하여 세션에 액세스하는 것입니다. function bool session_set_save_handler(콜백 열기, 콜백 닫기, 콜백 읽기, 콜백 쓰기, 콜백 파괴, 콜백 gc)는 이 문제를 해결하기 위해 제공되는 솔루션입니다.
이 함수에서 사용하는 6가지 함수는 다음과 같습니다.
1. bool open()은 세션 저장 메커니즘을 여는 데 사용됩니다.
2. bool close()는 세션 저장 작업을 닫습니다.
3. mixde read() 스토리지에서 세션 데이터를 로드할 때 이 함수를 사용합니다.
4. bool write()는 주어진 세션 ID의 모든 데이터를 스토리지에 씁니다.
5. bool destroy()는 지정된 세션 ID와 연관된 데이터를 파괴합니다.
6. bool gc() 스토리지 시스템의 데이터 가비지 수집 예제는 PHP 매뉴얼의 session_set_save_handler() 함수를 참조하세요.
클래스를 사용하여 처리하는 경우
session_set_save_handler(
array('클래스이름','열기'),
array('클래스이름','닫기'),
array('클래스이름','읽기'),
array('클래스이름','쓰기'),
array('className','destroy'),
배열('클래스이름','gc'),
)
className 클래스의 6개 정적 메서드를 호출합니다. ClassName은 개체로 변경할 수 있으므로 정적 메서드를 호출할 필요가 없습니다. 그러나 정적 멤버를 사용하면 개체를 생성할 필요가 없으며 성능이 더 좋습니다.
2.6 일반적으로 사용되는 세션 기능:
bool session_start(void) 세션 초기화;
bool session_destroy(void): 서버 측 세션 관련 파일을 삭제합니다.
string session_id() 현재 세션의 ID
string session_name() 현재 액세스된 세션 이름으로, 클라이언트가 세션 ID를 저장하는 쿠키 이름입니다. 기본값은 PHPSESSID입니다.
array session_get_cookie_params() 이 세션과 관련된 세션 세부 정보입니다.
string session_cache_limiter()는 세션을 사용하여 페이지의 클라이언트 캐시를 제어합니다.
ini session_cache_expire()는 클라이언트 캐시 시간을 제어합니다.
bool session_destroy() 서버측 세션 정보가 저장된 파일을 삭제합니다.
void session_set_cookie_params ( int life [, string path [, string domain [, bool secure [, bool httponly]]]] ) 이 세션과 관련된 세션 세부 정보를 설정합니다.
bool session_set_save_handler (콜백 열기, 콜백 닫기, 콜백 읽기, 콜백 쓰기, 콜백 파괴, 콜백 gc) 세션 처리를 위한 함수를 정의합니다(기본 메소드를 사용하지 않음)
bool session_regenerate_id([bool delete_old_session]) 새 세션 ID를 할당합니다.
2.7 세션 보안 문제 공격자는 기존 사용자의 유효한 세션 ID를 얻기 위해 많은 노력을 기울입니다. 세션 ID를 사용하면 시스템에서 이 사용자와 동일한 기능을 가질 수 있습니다.
따라서 우리의 주요 솔루션은 세션 ID의 유효성을 확인하는 것입니다.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 사용자 세션 ID가 위조된 경우*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();