Media Log

[쿠키]에 해당되는 글 1

  1. PHP 세션과 쿠키 2008.06.06

세션과 쿠키에 대해 자세히 알아보는 시간을 갖어볼까 합니다.


쿠키(Cookie)란?


   쿠키는 지정된 내용을 고스란히 클라이언트(Client)측의 컴퓨터에 남겨놓아 필요시에 사용하는

   서버와의 연결고리로 쿠키라고 부르게 된 원인이 이처럼 클라이언트쪽에 과자 부스러기처럼 남아있다고

   해서 과자라는의미로 쿠키라고 부르게 되었다고 한다.


   그러나 보안에는 조금 결점이 있는데 그 이유가 추후에 사용하고자 하는 내용을 기록하게 되면

   그 내용이 고스란히 사용자의 컴퓨터(이하 클라이언트)에 남기때문이다.


   악성유저의 경우는 이를 악용하는 사례가 종종 생겨서 이방식만 있을땐 꽤 골치가 아팠었다..


   그래서 새롭게 나온 방식이 세션이라는 연결고리이며 병행하기도 한다.


 

세션(session)이란?


  세션은 쿠키(Cookie)와 다르게 지정한 정보들을 서버쪽에 남겨두고 세션정보만을 클라이언트(Client)쪽에

  남겨두어 보안성에서 조금더 나은 방식의 연결고리인것이다.


  세션과 쿠키의 차이점을 아래 그림으로 보면 이해가 빠를것이다.



 


 


   위 그림처럼 쿠키의 경우는 서버쪽에서 저장하고자 하는 데이터를 몽땅 클라이언트쪽에

   넘겨주어 저장하게 되며 필요시 저장된 데이터를 불러오는데 이때 클라이언트쪽에서

   서버쪽에 받았던 내용을 다시 전달시켜주게 됩니다..

   그렇게 되면 서버쪽에서 전달받은 내용을 가지고 여러가지 비교등을 하여 사용에 맞도록

   가공하여 사용하게되겠습니다..


  이와 반대로 세션은 서버쪽에 저장하고자 하는 데이터가 고스란히 저장되며

  저장된 세션의 고유키(구분할수 있는 문자등)만을 클라이언트쪽에 넘겨주어

  클라이언트쪽에서는 넘겨받은 값(세션의 고유키)만을 저장하게 됩니다..

  그리고 필요시에 클라이언트쪽에 세션의 고유키값을 가지고 있는 쿠키를

  불러오도록 요청하게 되는데 이때 클라이언트는 요청받은 쿠키의 내용을

  서버에 전달시켜줍니다..

  그렇게 되면 서버쪽에서는 이 값이 정상적인 값(고유키를 넘겨주었을때 전달된 내용들)인지를 확인하고

  해당 내용을 가지고 사용에 맞도록 가공하여 사용됩니다..


  위에 언급한 내용중 "고유키를 넘겨주었을때 전달된 내용들" 이라고 명시한 부분이 있는데

  여기서 말하는 내용들에는 몇가지 정보가 함축되어있습니다..

  세션을 생성시에 클라이언트쪽에 넘겨주는 내용에는 다음과 같은 내용들이 함께 전달됩니다..


  1. 본인의 세션을 구별할수 있는 고유의 키값

  2. 생성한 세션에 대한 아이디값

  3. 도메인주소

  4. 그외


 세션과 쿠키는 어떻게 사용할까?


 세션과 쿠키를 생성할때 공통점이 있습니다..

 둘다 헤더가 시작하기 전에 사용해야 한다는 공통점이 있는데


 여기서 헤더라는것은 세션이나 쿠키가 생성되기 전에 어떠한 내용이 그 앞에 존재한다면

 그것이 헤더가 됩니다..


 그러나 웹의 용어로 보면 헤더는 문서가 시작되는 첫머리가 되겠는데요..


 이 용어에 대해서는 생략하기로 하구요


 세션과 쿠키에서 의미하는 헤더는 자신들이 실행되기 전에 무언가가 출력되어있는 것에 대한

 의미를 두고 있다는것을 인지하시면 됩니다..


 쉽게 예제를 보면


ex)

 echo "룰루랄라";

 setcookie("test","하하하",0,"/);


라고 하면

  이것은 오류를 일으킵니다..


쿠키를 생성하기 전에 룰루랄라 라는 단어가 이미 출력이 되어있기때문에

오류를 일으키게 되는것입니다...


왜 오류를 일으킬까?


그 이유는 세션이나 쿠키는 자신의 일을 수행함에 있어 헤더를 수정하여 사용하기때문입니다..


수정하여 사용하여야 되는데 이미 어떤값이 출력된 상태이면 헤더가 이미 사용되었기때문에

수정이 불가능한 상태로 되버려서 수정할수가 없기때문에 오류가 생기는 거죠..


이때 발생되는 오류메세지는 아래와 같습니다..


Warning: Cannot modify header information - headers already sent by (output started at 경로/파일이름.php:라인번호) in /경로/파일이름.php on line 번호


해석하면 헤더에 정보를 수정할수 없다. 경로/파일이름.php의 라인번호에 있는 내용에 의해

이미 헤더는 전달되어져있다.


정도로 해석을 할수가 있겠네요..


그렇다면 쿠키와 세션은 어떻게 사용할까?



쿠키사용방법


쿠키는 setcookie() 라는 함수로 쿠키를 생성하거나 해제할수 있으며 $HTTP_COOKIE_VARS (구버전) 나 $_COOKIE (php 4.x 이후) 라는 예약변수를 이용해서 생성되어있는 쿠키내용을 가져올수 있습니다..


setcookie() 함수의 레퍼런스


setcookie("쿠키변수명",["내용",유지시간,"경로","도메인","보안여부","httponly"]);


쿠키변수명은 말 그대로 변수이름이며 추후 $_COOKIE["변수이름"]; 으로 호출할때 사용됩니다..


이 이후로는 옵션으로 사용하지 않아도 무방하지만 가능하면 경로까지는 설정하시는것이 좋습니다..


내용은 쿠키변수가 가지고 있을 데이터내용이며


유지시간은 이 쿠키를 얼마동안 유지시킬지를 설정하는 부분으로 기본값은 0이며 0은 브라우저가

닫히기 전까지를 의미합니다..


경로는 어느경로에서 작동할지를 설정하는것으로 "/" 로 설정시 해당 도메인의 모든 경로에서

작동될수 있습니다..


도메인은 이 쿠키를 어느 도메인에서 사용가능토록 할지를 설정하는 부분으로

설정시 이 쿠키는 설정된 도메인에서만 사용될수 있습니다..


보안여부는 https 를 이용한다면 True 로 설정하면 되며


httponly 는 http 프로토콜에서만 열람(사용)할수 있도록 할건지를 설정하는 부분으로 True 로 설정하면

http 프로토콜외엔 사용이 불가능해진다고 합니다...

본인은 경로까지만 사용하여 정확한 작동반응은 설명을 할수가 없겠네요..


쿠키를 파기(삭제 혹은 해제라고도 함)시키는 방법은 setcookie("쿠키변수명","",-1 혹은 설정한 시간만큼 빼주면 됨,"사용한 경로","도메인"...);

으로 파기시킬수 있습니다..


세션은 어떻게 사용할까?


세션은 session_start(); 라는 함수를 호출후에 session_register() 라는 함수를 이용하여

생성할수 있습니다..


세션 파기하는 방법은 변수내용을 빈값으로 전달하거나

session_destroy() 함수를 이용해서 파기시킬수 있습니다..


session_register() 의 레퍼런스는


session_register("세션변수명");


으로 세션변수는 앞에서 지정하여야 합니다..


ex)


$test = "세션내용";

session_register("test");


가 되겠네요..


이에 앞서 어떠한 헤더를 사용하기 전에 session_start(); 를 먼저 호출하여야 정상적으로

생성하고 사용할수 있겠습니다...



이상으로 세션과 쿠키에 대해 알아보았는데요..


알고보면 어려운것이 아님을 알수 있습니다..


제가 이렇게 오픈백과에 이런 내용을 올리는것은 지식인과 같은곳에서 같은 문제에 대해


많은 질문을 하시기때문에 하찮지만 이 내용으로 해결하시고 더불어 조금더 자신의 것으로

만드시길 바라면서 올려봅니다.