메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

PHP 보안_세션과 쿠키(1)

한빛미디어

|

2006-03-20

|

by HANBIT

16,593

제공: 한빛미디어 네트워크 기사

역자: 한동훈
출처: [PHP 보안 : 몇 줄의 코드로 안전하게] Chapter 4 중에서


이 장에서는 세션에 대해 살펴보고 상태 관리가 필요한 웹 응용프로그램들이 갖는 위험에 대해 살펴볼 것이다. 먼저 상태, 쿠키, 세션에 대해 설명하고 난 다음에 쿠키 훔치기, 세션 데이터 노출, 세션 고정, 세션 하이재킹(hijacking)과 같은 몇 가지 공격을 살펴보고 이를 방어하기 위한 방법을 살펴볼 것이다.

HTTP가 상태없는(stateless) 프로토콜이라는 풍문은 사실이다. 다시 말해서, 두 HTTP 요청간에 관련성을 인식하지 못한다. HTTP 프로토콜 자체로는 클라이언트를 식별하기 위해 사용할만한 어떤 방법도 제공하지 않기 때문에 서버는 클라이언트들을 구별하지 못한다.

상태 관리라는 것은 어느 정도의 부하를 의미하기 때문에 HTTP의 무상태(stateless) 특징은 상당한 이점을 갖지만 상태 관리가 필요한 웹 응용프로그램을 작성해야 하는 개발자에게는 독특한 문제 거리를 던져준다. 클라이언트를 식별할 방법이 없다면 사용자가 이미 로그인을 했는지, 장바구니에 상품이 있는지, 사용자 등록을 요구해야 하는지 알 수 없다.

이 문제에 대한 멋진 해결책은 넷스케이프가 고안했던 쿠키라는 상태 관리 방법을 들 수 있다. 쿠키는 HTTP 프로토콜을 확장한 것으로 보다 정확하게 얘기하자면 두 가지 HTTP 헤더, 즉 Set-Cookie 응답 헤더와 Cookie 요청 헤더로 구성되어 있다.

클라이언트가 특정 URL에 대한 요청을 보낼 때 서버는 응답에 Set-Cookie 헤더를 함께 전달할 수 있다. 이후로 클라이언트가 보내는 요청에는 그에 상응하는 Cookie 헤더를 포함시킨다. [그림4-1]은 쿠키 교환 과정을 그림으로 표현한 것이다.


[그림 4-1] HTTP 트랜잭션을 통한 쿠키 교환 과정

쿠키 교환을 이용해서 각 요청의 Cookie 헤더 안에 식별 정보를 넣어두면 클라이언트를 식별하고 클라이언트 요청과 연관시킬 수 있게 된다. 이것이 상태 유지를 위해 필요한 전부이며 이 방법이 주로 사용되고 있다.

--------------------------------------------------------------------------------------
▒ Note ▒

쿠키에 대해 가장 좋은 레퍼런스는 넷스케이프에서 제공하는 스펙(http://wp.netscape.com/newsref/std/cookie_spec.html)이다. 이 스펙은 현재 업계에서 지원하는 쿠키와 가장 비슷하다.
---------------------------------------------------------------------------------------

세션 관리는 각 클라이언트별로 고유하게 부여된 식별 정보와 데이터를 함께 관리하여 상태를 유지하는 기능을 토대로 설계되었다. 이 데이터는 세션 데이터 저장소에 보관되며 각 요청마다 업데이트된다. 고유 식별자로 세션 데이터 저장소의 특정 레코드를 구별하기 때문에 세션 식별자 또는 세션ID(Session Identifier)라 부른다.

PHP에서 제공하는 세션 관리를 이용하면 개발자를 대신해서 세션과 관련된 처리를 자동으로 수행한다. session_start()를 호출하면 PHP는 현재 요청에 포함된 세션ID가 있는지 확인한다. 세션ID가 있으면 해당 세션에 대한 세션 데이터를 읽어들이고 슈퍼 전역 배열 $_SESSION에 저장한다. 현재 요청에 세션ID가 없으면 PHP는 세션ID를 생성하고 세션 데이터 저장소에 새로운 레코드를 생성한다.

PHP에서는 이 세션ID를 사용자에게 전달하고 각 요청에 대한 세션 데이터 저장소를 업데이트하는 것을 알아서 처리해준다. [그림 4-2]는 PHP의 세션 처리 과정을 나타낸것이다.


[그림 4-2] PHP는 개발자 대신 세션 관리의 복잡한 부분을 처리해준다

PHP가 제공하는 이러한 편의가 유용하기는 하지만 완벽한 해결책은 아니라는 것을 아는 것도 중요하다. PHP의 세션ID는 충분히 랜덤하게 생성되기 때문에 세션ID 추측 공격의 현실성은 거의 없다는 부분은 차지하더라도 PHP 세션 관리 자체의 취약점은 없다. 즉, 여러분이 해야할 일은 세션 이용에 따라 발생 가능한 모든 세션 공격으로부터 보호하기 위해 보호 수단을 제공하는 것이다. 이 장에서는 세션과 관련된 문제들과 해결책에 대해서 설명할 것이다.
TAG :
댓글 입력
자료실

최근 본 상품0