[시큐어코딩 가이드] 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출

 

 

 

■ 보안기능

 

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.

 

 

사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출

 

■ 개요

 

대부분의 웹 응용프로그램에서 쿠키는 메모리에 상주하며, 브라우저의 실행이 종료되면 사라진다. 프로그래머가 원하는 경우, 브라우저 세션에 관계없이 지속적으로 저장되도록 설정할 수 있으며, 이것은 디스크에 기록되고, 다음 브라우저 세션이 시작되었을 때 메모리에 로드 된다. 개인정보, 인증 정보 등이 이와 같은 영속적인 쿠키(Persistent Cookie)에 저장된다면, 공격자는 쿠키에 접근할 수 있는 보다 많은 기회를 가지게 되며, 이는 시스템을 취약하게 만든다.

 

 

■ 안전한 코딩 기법

 

쿠키의 만료시간은 세션이 지속되는 시간을 고려하여 최소한으로 설정하고 영속적인 쿠키에는 사용자 권한 등급, 세션ID 등 중요정보가 포함되지 않도록 한다.

 

 

코드예제

 

쿠키의 만료시간을 과도하게 길게 설정하면 사용자 하드디스크에 저장된 쿠키는 쉽게 도용될 수 있으므로 취약하다.

 

안전하지 않은 코드의 예
from django.http import HttpResponse

def remind_user_state(request):
res = HttpResponse()
# 쿠키의 만료시간을 1년으로 과도하게 길게 설정하고 있어 안전하지 않다.
res.set_cookie('rememberme', 1, max_age=60*60*24*365)
return res

 

만료시간은 해당 기능에 맞춰 최소로 설정하고 영속적인 쿠키에는 중요 정보가 포함되지 않도록 한다. 쿠키를 HTTPS를 통해서만 전송하도록 secure 속성값을 True(기본값은 False)를 사용할 수 있다. 

 

클라이언트 측에서 JavaScript를 통해 쿠키를 접근하지 못하도록 제한 하고자 할 경우엔 httponly 속성을 True(기본값은 False)로 설정한다. 다음은 쿠키 만료 시간을 1시간으로 설정한 예시이다.

 

안전한 코드의 예
from django.http import HttpResponse

def remind_user_state(request):
res = HttpResponse()
#쿠키의 만료시간을 적절하게 부여하고 secure 옵션을 활성화 한다.
res.set_cookie('rememberme', 1, max_age=60*60, secure=True, httponly=True)
return res

 

Django에서는 settings.py에 아래와 같이 추가하여 전역으로 설정할 수 있다.

 

안전한 코드의 예
# settings.py

SESSION_COOKIE_AGE = 60 * 60 # default 2weeks

SESSION_COOKIE_HTTPONLY = True # default True

SEESION_COOKIE_SECURE = True # default False

 

 

댓글

Designed by JB FACTORY