YSHUSH

쿠키와 세션관리 본문

Coding/Secure coding

쿠키와 세션관리

코딩; 2022. 1. 23. 14:18

˙쿠키란?

쿠키는 웹서버와 브라우저 간에 주고받는 문자열로, 클라이언트의 상태를 관리하지 않는 HTTP 프로토콜을 사용하는 웹 애플리케이션이 클라이언트와의 연속성을 유지하기 위해 사용하는 정보이다.

 

서버는 응답 헤더에 Set-Cookie: 이름=값 형식으로 클라이언트에게 쿠키 값을 전달하며, 브라우저는 접속하는 서버로부터 받은 쿠키 정보를 Set-Cookie: 이름=값 형식으로 요청 헤더에 포함시켜 서버로 전달한다.

 

˙쿠키(Cookie) 종류

일반적으로 사용되는 쿠키는 세션쿠키와 영속성 쿠키가 있다.

 

세션쿠키(Session cookie)

- 쿠키 만료일이 설정되어 있지 않음.

- 브라우저의 메모리에 저장하여 사용되며, 브라우저를 닫으면 삭제된다.

 

영속성 쿠키

- 쿠키 만료일이 설정되어 있음.

- 만료일 전에 브라우저가 종료되면 디스크에 저장하여 만료일까지 사용 가능한 쿠키.

 

˙쿠키(Cookie) 보안 취약점

쿠키 알고리즘은 매우 간단하여 쿠키 정보가 유출될 가능성이 높고, 이로 인해 중요 정보 노출이나 세션 탈취와 같은 침해 사고가 발생할 수 있다.

 

- XSS(크로스 사이트 스크립팅) 공격

  자바스크립트를 이용하여 document.cookie값을 탈취

- 스니핑(Sniffing) 공격

  네트워크를 통해 전송되는 쿠키 값을 암호화하지 않고 전송하는 경우 네크워크 스니핑 공격을 통해 쿠키값을 탈취

- 공용 PC에서 쿠키 값 유출

  영속성 쿠키는 하드디스크에 저장되며, 간단한 방법으로 접근 가능하기 때문에 공용 PC사용 시 PC에 저장된 사용자 정보 유출

 

˙쿠키의 속성을 이용한 보안성 강화

쿠키를 발행할 때 다양한 옵션의 속성을 설정할 수 있다.

cookie.setDomain("safety.com"); 	-> 브라우저가 쿠키값을 전송할 서버의 도메인 지정
cookie.setPath("/member");		-> 브라우저가 쿠키값을 전송할 URL지정
cookie.setMaxAge(30*60*24);		-> 쿠키의 유효 기간(만료일) 설정
cookie.setSecure(true);			-> SSL 통신채널(https://) 연결시만 쿠키를 전송하도록 설정
cookie.setHttpOnly(true);		-> 자바 스크립트에서 쿠키값을 읽어가지 못하도록 설정, 브라우저만 쿠키값을 읽을 수 있다.

cookie.setMaxAge(-1); 이라고 쓰면 세션 쿠키로 쓰겠다는 뜻이다.

 

˙세션이란?

일정 시간동안 같은 사용자(브라우저)로 부터 들어오는 일련의 요청을 하나의 상태로 보고 그 상태를 일정하게 유지하는 기술HTTP는 상태를 유지하는 기능이 없기 때문에 서버에 할당되는 세션 메모리와 세션ID, 쿠키를 이용하여 세션을 유지시킴.

 

HTTP 프로토콜은 상태관리를 하지 않는 (Stateless) 프로토콜이다.서버는 클라이언트의 정보를 유지하기 위해 세션 메모리를 할당하여, 클라이언트의 인증정보를 관리한다.

 

할당된 세션메모리를 구분하기 위해 서버는 세션ID를 할당하게 되며.할당된 세션 ID는 쿠키, URL파라미터, <form>의 hidden 파라미터값 형식으로 클라이언트에게 전달한다.

 

이렇게 세션을 유지하기 위해 전달된 세션ID 정보가 안전하게 생성되고 관리되지 않은 경우, 다른 사용자의 권한으로 해당 시스템의 서비스를 사용할 수 있는 세션 하이재킹 공격이 이루어지게 된다.

 

˙세션 ID 관리 취약점

- 세션 ID 추측

- 세션 ID 훔치기

- 세션 ID 고정

 

˙세션관리 취약점 진단 및 대응기법

#1 자동 로그아웃 기능이 있는지 확인한다.

세션 타임아웃이 적절하게 수행되지 않은 경우, 사용자가 LOGOUT 버튼을 클릭하지 않고 자리를 비운 사이 악의적인 사용자가 해당 웹브라우저를 이용하여 로그인한 사용자의 계정 정보를 이용하여 임의의 작업을 수행할 수 있다.

 

해결방법 : 서버 환경설정을 통해 자동 로그아웃 기능을 설정한다.

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

 

#2 로그아웃 후 다시 브라우저 페이지에 접속하여 세션이 종료되었는지 확인한다.

로그아웃을 수행할 때 세션을 완전히 삭제하고 로그아웃을 수행하는지 확인해야 한다.

로그아웃을 수행하고 브라우저를 종료하지 않는 경우 세션ID가 지속적으로 사용되어 이전 사용자 정보가 삭제되지 않고 유효한지 확인한다.

 

해결방법 : 로그아웃 요청 처리 시 세션정보를 완전히 삭제한다.

@RequestMapping("/logout.do")
public String logout(HttpSession session) {
		session.invalidate();
        	return "redirect:login.do"

 

'Coding > Secure coding' 카테고리의 다른 글

계정 및 인증관리  (0) 2022.01.23
SQL 인젝션  (0) 2022.01.23