티스토리 뷰

[.NET/ASP.NET] - 실전 ASP.NET Session [1] - 쿠키를 이용한 상태관리와 위험성
[.NET/ASP.NET] - 실전 ASP.NET Session [2] - 상태관리의 종류
[.NET/ASP.NET] - 실전 ASP.NET Session [3] - 다양한 세션 관리 방법
[.NET/ASP.NET] - 실전 ASP.NET Session [4] - 세션상태 마이그레이션


프로그램의 코드를 짜면서 쉽게 간과할 수 있는 상태관리 오류 등을 범하기도 합니다. 때론, 적절한 상태 저장소를 잘못 선택하여 잘못된 코드와 결과를 보는 경우도 있습니다. 이번 아티클은 그런 오류를 범하지 않고, 적절한 상태관리를 할 수 있도록 방법을 제시해 줄 예정입니다. 또한, 3회 포스팅 부터는 그저 별 것 아닌 Session 이라는 상태 저장소에 대해 좀 더 깊이 알아보고, Session 을 확장하는 방법과 시스템의 전반적인 설계 방법까지 알아볼 예정입니다.

 

1.    쿠키를 이용한 상태관리와 위험성

 

ASP.NET 플랫폼은 다양한 상태관리 방법을 제공해 줍니다. 그렇기 때문에, 개발자는 적절한 상태관리 저장소를 선택하기만 하면 됩니다. 그럼, 상태 관리의 종류와 이것을 선택하기 위한 조건, 적절한 사용 방법도 함께 살펴보겠습니다.

 

1.1.    쿠키 (Cookie) 를 이용한 상태관리

 

우선 쿠키의 생성 주기를 보면, 쿠키는 브라우져가 사이트에 요청을 할 때 생성이 됩니다. 그리고 브라우져를 닫으면 쿠키는 삭제됩니다. 이러한 쿠키에 대한 정보를 브라우져가 관리하게 되지만, 웹 서버에서 쿠키에 대한 만료시간 정보를 보낼 경우, 브라우져는 쿠키 정보를 하드 디스크에 저장하게 됩니다. 그리고 만료된 쿠키는 쿠키를 작성한 웹사이트를 방문할 때 브라우져가 삭제하게 됩니다.

 

[그림1] 자바스크립트로 네이버의 쿠키 정보 확인

 

쿠키는 브라우져마다 다를 수 있지만 최대 4096 Bytes(4KB) 의 텍스트 정보를 저장할 수 있고, 최대 300개의 쿠키를 보존하며, 사이트마다 20개의 쿠키를 허용 합니다. 용량과 개수의 제한이 있기 때문에, 경량의 정보를 저장할 때 유용합니다. 하지만, 쿠키의 만료시간을 지정하게 되면 텍스트로 사용자의 하드디스크에 정보를 저장하기 때문에 메모장을 이용하여 임의로 쿠키 정보를 변경할 수 있습니다. 심지어, 자바스크립트를 이용하여 쿠키를 조작할 수도 있기 때문에, 중요한 정보를 쿠키에 저장하는 것은 매우 부적합 합니다.

 

쇼핑몰의 최근 본 상품과 같이 서버에서 정보를 관리할 필요가 없고, 정보의 보안이 필요 없고, 가벼운 경우 선택하면 됩니다.

 

쿠키는 다음의 경우에 사용되면 됩니다.

1.      1회성 정보일 경우

2.      작은 양의 정보를 저장할 경우

3.      중요하지 않은 정보일 경우 (개인정보나 노출되면 안되는 정보는 절대로 쿠키를 사용하지 마십시오)

 

 

1.2.    쿠키의 위험성

 

위의 사용 조건이 충족 되었더라고 하더라도, 안심하면 안됩니다. 쿠키의 정보가 조작이 되었을 경우, 쿠키 정보를 절대로 신뢰하면 안되기 때문입니다.

 

다음과 같이 쿠키의 정보가 변경되었을 경우를 생각해 봅시다.

 

protected void Page_Load(object sender, EventArgs e)

{

   Response.Cookies["USERID"].Value = "<script>alert('a');</script>";

   Response.Write("USERID" + Request.Cookies["USERID"].Value );

}

 

위의 샘플은 특별한 오류가 없습니다. 하지만, 의도하지 않은 자바스크립트 코드가 실행됩니다.

 

그럼 좀 더 나쁜 상황을 만들어 보면,

 

Response.Cookies["USERID"].Value = "<script>location.href='http://피싱사이트.com';</script>";

 

Response.Cookies["USERID"].Value = "<script><iframe src='http://a.com/악성코드페이지.htm' /></script>";

 

물론, 위의 샘플은 프로그램적으로 잘못된 정보를 입력하였지만, PC 방과 같은 불특정 다수가 사용하는 곳의 PC 일 경우, 쿠키를 조작하여 피싱 사이트로 유도하여 사용자 아이디/비밀번호를 빼내거나, 중요한 개인 정보를 빼낼 수 있습니다. 또한, 악성코드가 포함된 페이지를 포함시킬 수 도 있습니다.

 

이럴 경우,

 

Response.Write( Server.HtmlEncode(Request.Cookies["USERID"].Value) );

 

같이 HTML Encoding 통해 쿠키를 스크립트로 조작하는 악의적인 조작을 피할 있습니다.

 

최근 옥션의 해킹 사건 이후, 2차 또는 3차 해킹 피해 까지 일어나고 있습니다. 이러한 최악의 시나리오가 내가 만든 코드에서 발생하였다면 얼마나 개발자로써 치욕적일까요? 빠듯한 일정이라도, 이러한 잔지식(?)을 오늘 알게 되었다면, 꼭 적용하시기 바랍니다.

 

[그림2] 양날의 검과 같은 쿠키 [ 사진출저는 여기 ]

 

위의 몇 가지 예시에서 본 것과 같이 쿠키는 매우 유용하면서도 위험할 수 있는 양날의 칼과 같습니다. 바로 쿠키의 값을 클라이언트 PC 에서 유지되고 있기 때문에, 의도되지 않은 다양한 조작이 이루어 질 수 있는 것입니다.

 

더 자세한 내용은 MSDN 내용을 참고하시면 사용방법이 잘 나와있기 때문에 MSDN 을 참고하시면 될 것 같습니다.

 

위키피디아 http://en.wikipedia.org/wiki/Http_cookie

MSDN - http://msdn.microsoft.com/ko-kr/library/ms178194(VS.80).aspx

 

댓글