PHP 세션을 사용할 때, 세션 쿠키의 보안 설정은 매우 중요하다. 특히 Secure와 HttpOnly 플래그를 적절히 설정하지 않으면 보안 취약점에 노출될 수 있다. 이 글에서는 PHP에서 Secure와 HttpOnly 설정의 중요성과 쿠키가 두 번 설정되는 문제와 그 해결 방법을 함께 설명한다.
Secure 플래그란?
Secure 플래그는 쿠키가 HTTPS 연결에서만 전송되도록 하는 설정이다. 이를 통해 암호화되지 않은 HTTP 연결에서 쿠키가 전송되지 않도록 할 수 있다.
왜 Secure 플래그가 중요한가?
Secure 플래그가 설정되지 않으면, HTTP로 전송되는 쿠키는 공격자가 중간에서 탈취할 수 있다. Secure 플래그는 이를 방지하고, HTTPS를 통해 안전하게 쿠키가 전송되도록 보장한다.
HttpOnly 플래그란?
HttpOnly 플래그는 쿠키가 클라이언트 측의 JavaScript에서 접근되지 않도록 보호하는 설정이다. 이는 XSS(크로스 사이트 스크립팅) 공격으로부터 쿠키를 보호하는 중요한 방법이다.
왜 HttpOnly 플래그가 중요한가?
JavaScript가 쿠키에 접근할 수 있으면, 악의적인 코드가 세션 정보를 탈취할 수 있다. HttpOnly 플래그는 이를 방지하고, 쿠키가 서버 요청에서만 사용되도록 보장한다.
Secure와 HttpOnly 플래그를 함께 설정해야 하는 이유
Secure와 HttpOnly 플래그는 각각 중간자 공격과 XSS 공격을 막는 중요한 보안 설정이다. 두 플래그를 함께 설정하면 세션 쿠키의 보안이 대폭 강화된다.
설정방법
session.cookie_secure = On
session.cookie_httponly = On
php.ini 에 위와 같은 설정값을 추가한다. 설정 후에 php-fpm 을 재시작한다. apache 와 연동하여 사용하는 경우에는 아파치를 재시작한다.
확인방법
브라우저의 개발자 도구를 사용하여 설정이 제대로 적용되었는지 확인할 수 있다.
브라우저 기록삭제: 브라우저에서 해당사이트의 기록을 삭제한다.
브라우저 개발자 도구 열기: F12 또는 Ctrl+Shift+I를 눌러 개발자 도구를 연다.
Application 탭에서 Cookies 확인: 해당 사이트의 쿠키가 Secure와 HttpOnly로 설정되어 있는지 확인한다.
혹시 set-cookie 가 두번 나오는 경우
php 에서 session_start(); 가 두번 이상 호출되는 것은 아닌지 확인한다. 또는 session_start(); 가 호출 된 이후에 setcookie 같은 함수를 이용하여 쿠키의 설정을 변경하지는 않았는지 확인한다.
결론
PHP에서 session.cookie_secure와 session.cookie_httponly 설정은 세션 쿠키의 보안을 크게 강화하는 중요한 방법이다. Secure 플래그는 HTTPS에서만 쿠키가 전송되도록 하고, HttpOnly 플래그는 JavaScript에서 쿠키에 접근하지 못하게 한다. 또한, Set-Cookie 헤더가 두 번 설정되는 문제는 중복된 세션 시작이나 설정 중복으로 인해 발생할 수 있으며, 이를 방지하는 방법을 통해 서버와 애플리케이션의 보안을 강화할 수 있다.