php에서는 쿠키와 세션을 가지고 인증을 한다.
쿠키
-클라이언트에 데이터를 저장하였다가 서버의 요청에 의해 다시 서버로 보내주는 정보
세션
-컴퓨터 간의 연결이 이루어진 시점부터 연결을 끊을 때까지의 기간
쿠키란?
-방문자의 컴퓨터에 어떠한 정보를 저장해 놓는 것을 말한다.
어떤 사이트에 로그인을 하면 사용자 컴퓨터에 쿠키를 저장해 놓고 그 쿠키를 갖고 있는지를 확인하여 회원인지 아닌지 판단한다.
쉽게 생각하여 학교에서 학생들을 쉽게 알아보기 위해 가슴에 이름표를 달아 주는데, 그것이 바로 쿠키이다.
쿠키굽기
setcookie (이름, 값, 폐기시간, 경로, 호스트, 보안사용);
주로 이름,값,폐기시간,경로 네가지 매개변수만 많이 사용된다.
이름-쿠키의 이름
값-쿠키의 값
폐기시간- 쿠키의 폐기시간(주로 유닉스타임스탬프를 사용하며, 0일때는 웹브라우저가 닫히
면서 쿠키가 사라진다. 적지 않으면 0과 같은 효과)
경로 - 쿠키가 적용될 경로 ( /로 설정하면 서버의 루트 하위의 폴더에 모두 적용)
호스트 - 쿠키가 적용될 호스트 이름
보안사용- HTTPS프로토콜에 의한 보안 접속시에만 쿠키굽기
<?
echo "잘못된 예제";
setcookie("test", "123");//테스트라는 이름의 쿠키에 123이라는 값을 넣어준다는 뜻
?>
위 예제는 에러가 나는데 그 이유는
setcookie함수는 header함수와 마찬가지로 함수 호출전 어떠한 출력문도 오면 안되기 때문이다.
이런 에러를 방지하기 위해서는
ob_start라는 함수를 호출하여 출력버퍼링을 사용해야 한다.
ob_start함수
-이 함수는 출력버퍼링이라는 기능을 사용하도록 해주는 함수
이 함수를 페이지의 첫 부분에 사용하면 출력문의 출력 내용을 출력하지 않고, 페이지의 내용을 모두 처리한 다음에 비로소 출력문의 내용을 출력한다.
때문에 header, setcookie, session함수와 같이 출력문이 있기 이전에 사용되어야 하는
함수의 이전에 출력문이 있는 경우라면
ob_start함수를 호출하면 에러없이 잘 작동하게 된다
<?
ob_start (); //출력버퍼링시작
echo "잘못된 예제";
setcookie("test", "123");
$print=ob_get_contents(); //버퍼의 내용을 $print에 저장
ob_end_clean (); //버퍼를 비움
echo $print; //출력
?>
결과는 잘못된 예제
->ob_start함수로 출력 버퍼링을 실행하여 실제로 에코문에서의 출력내용은 출력되지 않고 출력버퍼에 저장된다. 그렇기에 셋쿠키함수가 에러없이 호출되며, 셋쿠키 함수처리가 끝난 후 ob_get contents함수를 호출하여 출력버퍼에 저장된 내용을 $print변수에 저장하고, ob_end_clean함수를 호출하여 출력버퍼링을 종료하고 출력버퍼를 비워주게 된다. 마지막으로 $print를 출력해주면 출력버퍼에 저장되어있던 내용이 화면에 출력된다.
물론 위 과정 없이 소스의 가장 처음에 ob_start함수만 호출해주어도 소스는 이상없이 실행된다.
<?
ob_start (); //출력버퍼링시작
echo "잘못된ss 예제";
setcookie("test", "123");
?>
->잘 실행됨
<?
setcookie ("a", "123", 60 + time(), "/");
?>
60초 동안만 쿠키가 존재하며, 60초 이후에는 쿠키가 사라진다.
하루동안 쿠키를 주려면 24*60*60 + time() 으로 주면된다.
/
서버의 루트를 말함, 그 하위 모든 폴더의 문서에서 그 쿠키를 꺼내올 수 있게 한다.
만약 /test 라고 하였다면 테스트 하위에서는 그 쿠키를 꺼내올 수 있으나, 그 상위폴더에서는 꺼내 올 수 없게된다.
쿠키값체크
<?
setcookie("test", "123", 60+time(), "/");
echo $test;
?>
결과는 123
<팁>
폼에서 넘어온 post, get 방식의 변수와 쿠키 변수의 사용에 관한 우선 순위는
php.ini의
gpc_order라는 부분에서 결정된다. g(get), p(post), c(cookie)
기본적으로 gpc라는 값으로 설정되어 있기에 겟방식으로 넘어온 변수를 가장 먼저 처리하고 쿠키변수를 가장 마지막에 처리한다.
cpg로 바꾸면 반대로 처리되며, pg와 같이 해주면 쿠키변수는 처리하지 않게 된다
쿠키값확인
$HTTP_COOKIE_VARS[쿠키이름]
<?
setcookie("test", "123", 60+time(), "/");
echo $HTTP_COOKIE_VARS[test];
?>
결과는 123
위의 예제를 바로 수정하여
<?
$test=456;
echo $HTTP_COOKIE_VARS[test];
?>
이라고 하였다면 1분동안은 123이라고 나오지만
곧 1분후에는 아무값도 출력되지 않는다.
쿠키변수와 일반변수는 다르기에
쿠키값의 삭제
쿠키를 삭제해주는 명령어나 함수는 존재하지 않기에
셋쿠키함수를 이용하여 같은 이름의 쿠키를 빈값으로 구워주는 것으로 쿠키를 삭제할 수 있다.
<?
setcookie ("test", "", 0, "/");
?>
쿠키이름을 test로 하여 빈값을 넣고, 시간을 0으로 주어 브라우저가 닫히면서
test라는 쿠키가 완전히 사라지도록 해주었다.
<?
setcookie ("test", "", time(), "/");
?>
폐기시간을 time()으로 해주면 페이지가 실행된 후 1초가 지나면 바로 폐기시간이 되어 쿠키는 완전히 사라진다.
쿠키의 문제점
-웹프로그램에 있어서 시간이라는 것은 서버의 시간과, 클라이언트의 시간으로 나누어 생각할 수 있는데,
우리가 쿠키를 구울 때 사용하는 time()함수는 서버의 시간을 기준으로 현재 시간을 가져온다.
그러나 쿠키의 폐기 시간이 되었는지 확인하는 것은 바로 클라이언트로,
폐기의 유무는 클라이언트시간을 기준으로 판단하는 것이기에
서버시간과 클라이언트 시간이 다르면 쿠키에 있어서 문제가 발생할 수 있다.
예를들어 서버시간이 1시1분0초에 60초 동안 쿠키를 구워주었다고 하자
그런데 클라이언트시간은 서버시간보다 2분이 빠른 1시3분0초였다.
쿠키는 1시2분0초까지 살아있게 되는데
클라이언트 시간은 이미 1시3분0초이므로 절대 쿠키가 구워지지않는 현상이 발생한다.
물론 쿠키의 폐기시간을 0으로 해주었다면 쿠키는 잘 구워진다.
그 다음문제로 쿠키의 값이 삭제가 되지 않는 문제인데, 위의 경우와 반대로, 서버의 시간이 클라이언트의 시간보다 빠르다면 쿠키는 우리가 정해진 시간에 폐기되지 않게 된다.