ice rabbit programming

[보안] 쿠키 및 세션 관리 본문

Development/Secutiry

[보안] 쿠키 및 세션 관리

판교토끼 2021. 3. 24. 00:53

쿠키

쿠키(Cookie)는 HTTP 통신 시에 사용자 정보 유지를 위해 헤더에 붙여 전송하는 정보이다. 즉, 서버에서 필요로하는 클라이언트 정보를 헤더에 붙여서 전달하는 것이다.

  • 세션 관리를 위해서 token을 저장하거나 임시 데이터 관리 등에 사용된다.
  • 중요 정보를 가진 쿠키는 반드시 암호화된 데이터 통신에서만 전달되도록 해야 한다.
  • 세션 쿠키 : 서버를 이용하는 동안 사용자 정보를 유지한다. 자바스크립트에서 액세스할 수 없도록 쿠키의 속성을 설정해서 사용해야 한다.
  • 영구(영속성) 쿠키 : 하드 디스크에 저장되는 쿠키로, 재방문시 사용자 정보를 기억하는 데에 사용된다. 중요 정보를 가지지 않도록 관리해야 한다.

쿠키를 주고 받는 메커니즘은 다음과 같다.

서버->클라이언트 : 쿠키 객체 생성(key:value) -> 쿠키 속성 설정 -> 전송
클라이언트->서버 : 모든 쿠키 얻음 -> 설정 정보 읽음 -> 배열로 저장 -> 전송

이는 XSS 공격과 네트워키 스니핑에 취약하므로 상술한 것처럼 암호화가 필요하다. 더불어 쿠키 속성을 통해 보안을 강화할 수 있다. 예를 들어 spring에서는 쿠키에 domain, expires, secure(https에서만 사용), httponly 등의 속성을 줄 수 있다.

세션

세션은 웹 서버와 브라우저 사이의 논리적 연결로, HTTP에서 Client의 정보를 관리하기 위해 사용한다(HTTP는 Stateless 프로토콜). 연결 관리를 위해 서버에서는 클라이언트마다 세션 메모리를 할당하고 세션 ID로 구분하는데, 주로 이 세션 ID를 통해 인증된 사용자를 확인한다.

아래와 같은 방법으로 보안을 강화할 수 있다.

  • 강력한 암호화 알고리즘을 사용하고, 충분히 긴 세션을 사용하면 보안을 강화할 수 있다.
  • 네트워크 스니핑이나 XSS 공격을 방지하기 위해 쿠키와 같이 httponly나 secure 속성 등을 설정하면 좋다.
  • 세션 ID 고정 공격(세션을 발행한 페이지가 아니어도 같은 세션 ID인 경우)를 방지하기 위해 url rewrite를 사용하지 않고, 로그인 시 세션 ID를 리셋한다.
  • 금융 관련이나 정부 사이트에서 흔히 볼 수 있는 형태로, 일정 시간 사용하지 않으면 자동 로그아웃을 건다.

헤더 설정

쿠키/세션은 몇 가지 헤더 설정을 통해서 취약점들을 제거 및 완화시킬 수 있다.

  • Content-Security-Policy
  • X-Frame-Option
  • X-Content-Type-Option
  • Strict-Transport-Security

클릭 재킹

마지막으로 쿠키/세션을 탈취하는 공격으로 클릭 재킹이 흔히 사용되는데, 투명한 프레임(frame)을 사용해 허위 클릭을 유도하는 공격이다. 헤더에서 X-Frame-Option을 설정하거나(서버), 브라우저 플러그인(클라이언트)으로 방지할 수 있다.

'Development > Secutiry' 카테고리의 다른 글

[보안] 접근제어  (0) 2021.12.19
[보안] 계정 및 인증 관리  (0) 2021.10.05
[보안] 파일 업로드/다운로드 취약점  (0) 2021.01.17
[보안] XSS(사이트 간 스크립팅)  (0) 2020.05.01
[보안] 인젝션  (0) 2020.04.19