[시큐어코딩 가이드] 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출
- 정보보안/시큐어코딩 가이드
- 2022. 8. 12.
■ 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출
■ 개요
대부분의 웹 응용프로그램에서 쿠키는 메모리에 상주하며, 브라우저의 실행이 종료되면 사라진다. 프로그래머가 원하는 경우, 브라우저 세션에 관계없이 지속적으로 저장되도록 설정할 수 있으며, 이것은 디스크에 기록되고, 다음 브라우저 세션이 시작되었을 때 메모리에 로드 된다. 개인정보, 인증 정보 등이 이와 같은 영속적인 쿠키(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 |