
PHP의 내장 함수인 setcookie()는 쿠키를 생성하는 데 사용된다. 쿠키에 접근하려면 $_COOKIE 슈퍼글로벌 배열 또는 filter_input()과 filter_input_array() 함수를 사용할 수 있다.
setcookie($nmae, $value);
PHP의 setcookie() 함수는 웹 페이지와 함께 전송되는 HTTP 헤더를 생성하고 브라우저가 쿠키를 생성하도록 지시한다. 이 함수는 쿠키의 이름과 값을 설정할 수 있게 한다.
이 함수는 HTTP 헤더를 생성하므로 쿠키의 내용이 브라우저로 전송되기 전에 사용되어야 한다. 심지어 <?php 여는 태그 앞의 공백도 내용으로 취급된다.
쿠키의 만료일을 설정하지 않으면, 사용자가 브라우저를 닫을 때 브라우저가 쿠키 데이터를 서버로 보내는 것을 중지한다.
$preference = $_COOKIE['name'] ?? null;
브라우저가 쿠키를 저장했다면, 해당 브라우저가 사이트의 다른 페이지를 요청할 때 쿠키 이름과 값을 요청과 함께 서버로 전송한다. PHP 인터프리터가 요청을 받으면 $_COOKIE라는 슈퍼글로벌 배열에 쿠키 데이터를 추가한다.
새로운 요소가 쿠키에 대한 배열에 추가되면
이런 데이터는 수집되어 변수에 저장된다.
코드에서 $_COOKIE에 없는 키에 접근하려면 오류가 생긴다. 이를 방지하려면 널 병합 연산자를 사용하여 배열에 키가 있는지 확인할 수 있다. 키가 배열에 존재한다면 쿠키의 값이 변수에 저장된다. 만약에 존재하지 않는다면 변수에는 null 값이 저장된다.
$preference = filter_input(INPUT_COOKIE, $name[, $filter[, $options]]);
PHP의 filter_input()과 filter_input_array() 함수는 쿠키 데이터를 수집할 수도 있다. 입력 유형은 INPUT_COOKIE에 설정해야 한다.
두 번째 매개변수는 쿠키의 이름이다. 세 번째, 네 번째 매개변수는 선택사항이다. 사용할 필터의 ID와 필터에 대한 옵션을 지정한다.
만약에 쿠키가 전송되지 않은 경우, 함수는 오류를 발생하지 않는다. 또한 정수, 부동 소수점 수, 불리언 필터를 사용하면 값을 해당 데이터 타입으로 변환한다.
setcookie()에는 브라우저가 쿠키를 사용하는 방법을 제어하는 매개변수가 있다. 쿠키를 통해 받은 데이터의 유효성 검사를 해야 하고 해당 내용이 페이지에 표시되는 경우라면 htmlspecialchars()도 사용해야 한다.
쿠키에 저장된 값을 업데이터하려면, 쿠키에 대한 새로운 값으로 setcookie()를 다시 호출하자. 브라우저가 쿠키를 보내는 것을 중지하려면 다시 setcookie()를 호출하자. 값은 빈 문자열로 하고 만료일을 과거의 시간으로 한다. 만약에 값이나 쿠키의 만료일을 업데이트하고자 한다면, 마지막 네 개의 인수는 쿠키가 생성될 때 사용했던 것과 동일한 값을 반드시 사용해야 한다.
페이지 요청과 함께 쿠키를 흉내내는 HTTP 헤더를 보낼 수 있기 때문에
서버는 쿠키 데이터를 사용하기 전에 유효성 검사를 해야 한다.
쿠키값이 페이지에 표시된다면, XSS 공격을 막기 위해 htmlspecialchars()를 사용해야 한다.
setcookie($name[, $value, $expire, $path, $domain, $secure, $httponly])
- $name : 쿠키의 이름
- $value : 쿠키가 보유해야 하는 값(이것은 문자열로 취급됨 - 쿠키는 데이터 타입을 저장하지 않음)
- $expire : 브라우저가 쿠키를 서버에 보내는 것을 멈춰야 하는 날짜와 시간(유닉스 타임스탬프)
타임스탬프를 설정하려면 PHP의 time() 함수를 사용하고 쿠키를 유지하고자 하는 기간을 추가한다.(ex. 1일 : time() + 60 * 60 * 24)- $path : 쿠키가 사이트의 일부에만 필요한 경우, 쿠키를 사용해야 하는 디렉터리를 지정한다. 디폴트로, 경로는 모든 디렉터리를 의미하는 루트 폴더 '\' 이다. 이것을 /members로 설정한다면 사이트의 members 폴더에 있는 페이지에만 전송된다는 의미다.
- $domain : 쿠키가 하위 도메인에만 필요하다면, 하위 도메인에 대한 URL을 설정한다. 디폴트로는 사이트의 모든 하위 도메인에 전송된다. 만약에 하위 도메인으로 members.example.org를 설정한다면, 쿠키는 하위 도메인인 members.example.org의 파일에만 전송된다.
- $secure : 이 값이 true이면 브라우저에 쿠키가 생성되지만, 보안 HTTPS 연결을 사용하여 페이지가 요청된 경우에만 브라우저가 서버로 쿠키를 보낸다.
- $httponly : 이 값이 true이면 쿠키는 서버로만 전송한다(자바스크립트에서 접근할 수 없음).
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022