본문 바로가기

아카이브/PHP

세션&쿠키&사용자 인증

반응형

쿠키와 세션. 그리고 인증

 

프로젝트가 커질수록 사용자를 추적할 수 있는 방안이 필요하다. 로그인과 암호 입력 없이 현재 세션에 대한 자세한 정보를 저장하고, 가능하다면 사용자가 다시 방문할 때 재차 인증 필요 할 없이 처리할 수 있어야 한다.

이 때 쿠키와 세션이 유용하게 사용될 수 있다. 비단 로그인 유지를 위해서만 사용하는 도구는 아니지만 쿠키와 세션은 로그인 유지(인증)를 구현하는 데 있어서 적합한 개념이다.

 

[쿠키]

쿠키는 서버가 클라이언트(서버에 접속하는 매체들. 웹브라우저나 안드로이드 기기)를 이용해 사용자의 컴퓨터에 저장하는 데이터이다. 쿠키는 보안상의 이유로 그것을 만든 도메인에 의해서만 읽힌다. 쿠키는 웹페이지의 실제 HTML이 전달되기 전에 헤더를 전달하는 과정에서 교환되고, 어떤 html이 전달되면 쿠키는 보낼 수 없다.

사용예) 세션추적과 여러 방문에 걸친 데이터 보관, 쇼핑 카트 내용의 유지, 로그인 정보 저장 등에 사용

 

setcookie(name, value, expire, path, domain, secure, httponly);

name : 쿠키의 이름 (필수)

서버가 뒤 이은 브라우저의 요청에 대해 쿠키에 접근 할 때 사용할 이름

value : 쿠키의 값 (옵션)

문자/숫자형 4kb 텍스트까지 포함

expire : 만기되는 날짜의 유닉스 타임스탬프 (옵션)

일반적으로 time() 더하기 초의 수를 더한 것을 사용한다. 설정되지 않으면(Default = 0) 브라우저가 종료할 때 만료된다.

path : 서버에서 쿠키의 경로 (옵션)

이 경로에서만 쿠키가 유효하다. ‘/’ 이면 모든 도메인에서 사용 가능하다. 경로를 하부디렉토리로 지정했다면, 그 상위디렉토리에서는 쿠키가 무효하다. 기본 설정은 쿠키가 설정된 현재 디렉토리이다.

domain : 쿠키의 인터넷 도메인. (옵션)

도메인은 제외한 도메인의 하부 도메인에서만 유용하다.

secure : 쿠키가 안전한 연결(https://)을 사용해야 하는지 나타냄 (옵션)

값이 true이면 쿠키는 안전한 연결을 통해서만 전달되고, 기본값은 false이다.

httponly : 쿠기가 http프로토콜을 사용해야 하는지 나타낸다. (옵션)

값이 true이면 스크립트 언어는 쿠키에 접근할 수 없다. php 상위버전에서 지원하는 기능이기 때문에 모든 브라우저에서 지원하지는 않는다. 기본 설정은 false이다.

 

*현재 도메인의 전체 웹서버에서 접근 가능하게 하고, 7일 후에 브라우저의 캐시에서 제거되는 이름 'user''cookie' 값을 갖는 쿠키는 다음과 같이 작성

setcookie('username', 'cookie', time() + 60*60*24*7, '/');

 

 

쿠키접근은 전역변수에 접근하는 것과 같다.

$_COOKIE[‘user’] = ‘delicious’;

$cookie_value = $_COOKIE[‘user’];

ehco $cookie_value; //출력되는 값은 deilicious

 

또한, isset() 메소드와 함께 사용해서 현재 쿠키값이 있는지 검사할 수 있다.

isset() 메소드는 인자에 들어가는 값이 존재한다면 1을 반환하고, 없다면 0을 반환한다.

if(isset($_COOKIE[‘user’]))

echo $_COOKIE[‘user’]; //출력되는 값은 쿠키값

else echo “COOKIE is empty“;


쿠키를 삭제하려면 다시 불러와서 과거의 날짜로 설정해야만 한다. 서버는 클라이언트에 저장되어 있는 쿠키를 직접 제어할 수 없기 때문에 만료된 쿠키를 새로 발급하여 삭제하는 작업이 가능하다.

타임스탬프를 제외하고 쿠키가 처음 사용됐을 때의 매개 변수를 새로운 setcookie에 모두 같게 써야 한다. 이전에 만든 쿠키를 지우려면 다음과 같이 작성한다.

setcookie('user', 'cookie’, time() -2592000, '/');

시간이 과거로 설정돼 있는 쿠키는 지워져야 한다. 그러나 사용자의 컴퓨터 날짜와 시간이 부정확하게 설정된 경우를 대비해서 2592000(한달)의 시간을 사용한다.

 

 

[세션]

쿠키가 클라이언트에서 보관하는 자료인 반면에, 세션은 서버에서 보관하는 자료이다. 서버에 접속하는 클라이언트들을 식별하기 위해 세션 키를(식별하기 위해 사용하는 키) 쿠키로 발급하는 방법이 있다. 클라이언트에서는 이 세션 키(=쿠키)를 유지하는 것이 서버에서 보관하고 있는 세션과 연결되는 통로이다. 세션 키는 일반적으로 서버에 처음 접속할 때 서버에서 발급해주는 것을 접속 종료 시까지 유지해야 하며, php.ini 파일에 있는 설정 값을 조정함으로써 유효기간의 조정이 가능하다.

하지만 세션 키(쿠키)만 있다고 세션이 연결된 것이 아니라 서버 측에서 세션 로그인 프로세스를 수행하여 서버 측 세션에 정식 사용자로 등록 되도록 해야 한다. 방금 말한 부분은 뒤에 설명하겠지만 서버에서도 세션 키 값을 보관해야 한다는 것과 비슷하다.

서버에서 발급되는 쿠키는 보관 해야 하며, 보관된 쿠키를 모든 요청에 대해 함께 제출해 주어야 한다. 서버에서 발급하는 쿠키에는 서버가 설정한 유효 기간과 범위가 있으므로, 이 기간과 범위에 맞추어 제출 여부도 결정해 주어야 하는데. 이런 복잡한 작업을 직접 구현하기는 번거롭고 귀찮은 작업이다. 안드로이드 어플리케이션을 개발하는 중이라면 이런 작업들을 처리 해주는 라이브러리가 있는데 바로 HttpClient 라이브러리이다. 세션을 위한 쿠키 처리를 직접 할 필요 없고 해당 서버의 로그인 페이지를 먼저 호출하여 HttpClient 가 정상적인 세션키를 수집하게만 하면 별다른 작업을 할 필요가 없다.

, 세션은 HttpClient 인스턴스에 종속되기 때문에 세션 유지 기단동안은 새로운 인스턴스가 아닌 하나의 인스턴스를 이용해야 한다. 이것 때문에 안드로이드-php간의 로그인 유지하는 작업에 있어서 많은 시간을 소모하였다. 필자는 하나의 인스턴스를 이용하기 위해서 static으로 선언하였다.

서버에서 세션을 시작하기 위해서는 session_start() 메소드를 사용한다. 이 메소드는 세션을 사용하는 코드파일에서는 필수적으로 호출되어야 하고, 출력 문이 있기 전에(코드 상단 부분) 호출한다.

세션을 시작하면 사용자에게 세션 키가 발급된다. 일반적으로 클라이언트에게 PHPSESSID라는 이름으로 헤더에 포함된 쿠키가 전송되고, 기록된다. 반복해서 언급하였지만 PHPSESSID는 쿠키 값이다. 이 값은 서버에 접속하는 클라이언트들마다 다르게 부여된다.(편리하다)

반응형

'아카이브 > PHP' 카테고리의 다른 글

[환경변수] SERVER 전역변수  (0) 2015.01.29
트랩도어함수(암호화)  (0) 2015.01.21
[php]GET&POST 방식  (0) 2015.01.12
[php]한글 깨짐 현상 해결  (0) 2015.01.11
[PHP]  (0) 2015.01.09