[spring] 쿠키를 이용한 로그인 인증의 보안 문제와 해결 방안

woply·2022년 2월 18일
1

spring

목록 보기
19/20
post-thumbnail

📖 ✏️

이 글은 쿠키 기반의 로그인 인증 시 발생할 수 있는 보안 문제세션을 이용한 해결 방법을 학습하고 정리한 포스팅이다.


쿠키를 이용한 로그인 인증의 보안 문제와 해결 방안

쿠키는 클라이언트가 서버에 요청을 보낼 때, 간편하게 이용할 수 있는 식별 값이다. 쿠키는 대부분의 클라이언트 웹브라우저가 지원하는 방식이고, 모든 클라이언트 요청에 쿠키 정보가 함께 전달되므로 활용도가 좋다. 하지만 이용자를 식별할 수 있는 핵심 정보를 쿠키 값으로 사용하게 될 경우 치명적인 보안 문제가 발생한다. 쿠키 방식의 인증 처리는 어떠한 보안 문제가 있으며, 이를 해결할 수 있는 대안은 무엇인지 알아보자.


1. 쿠키 기반의 로그인 인증 시 발생하는 보안 문제

쿠키를 사용하면, 간단하게 사용자를 식별하고 로그인 상태를 유지할 수 있다. 하지만, 개발자가 생성하여 부여하는 쿠키 값은 필연적으로 규칙성을 갖게 된다. 규칙성은 유추를 가능케 하므로 아래와 같이 의도적으로 규칙성을 악용한다면 다른 사용자의 접근 권한을 얻을 수 있다.

쿠키 값의 변경으로 인해 발생하는 보안 문제

  • 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다.
  • 웹브라우저는 개발자모드에서 Cookie 값을 간단한게 변경할 수 있다.
  • 예를 들어 memberId=1이라는 쿠키 값을 memberId=2로 수정하면 서버는 다른 사용자로 인식한다.

만약, 쿠키에 개인 정보나 금융 정보를 집적 저장하거나, 쿠키 값을 이용해 중요한 정보를 조회할 수 있다면 보안에 심각한 문제가 생긴다. 쿠키는 네트워크 전송 구간에서도 탈취가 가능하기 때문에 더욱 보안에 취약하다.


2. 해결 방법: 어려운 쿠키 값을 이용하는 세션 방식의 도입

쿠키 방식은 외부에 쉽게 노출되기 때문에 보안 문제에 취약했다. 하지만, 인증을 위해서는 클라이언트가 쿠키 저장소에 저장된 쿠키 값을 입장권처럼 사용할 수 있어야 한다. 이 문제를 어떻게 해결해야 할까?

클라이언트에게 쿠키 값을 부여한다는 기존의 아이디어를 유지한 채, 실제 전달하는 쿠키 값은 유추가 불가능한 랜덤 값을 사용하면 된다. 이와 같은 랜덤 값을 토큰이라 한다. 중요한 정보는 서버에 보관하고, 해당 정보와 매칭되는 토큰을 생성하여 클라이언트에 쿠키 값으로 전달한다. 토큰은 랜덤하게 생성되므로, 외부에 노출되어도 조작이나 예측이 거의 불가능하다. 이와 같은 방식을 세션이라 한다.

클라이언트에 전달하는 토큰은 만료 시간을 지정할 수 있다. 만료 시간을 짧게 설정하고, 주기적으로 토큰 값을 교체하여 보안 문제를 해결할 수 있다.


3. 세션 방식의 동작 원리

세션 방식은 쿠키 방식과 어떤 차이가 있을까? 로그인 과정을 단계적으로 살펴보며, 세션 방식의 동작 원리를 파악해보자.

1. 로그인
사용자가 loginId , password 정보를 전달하면 서버에서 해당 사용자가 맞는지 확인한다.

2. 세션을 생성하고, 서버에 저장한다
회원이 확인되고, 기존의 세션 ID가 없으면 새로운 세션 ID를 생성한다. 세션 ID는 예측이 불가능한 랜던 수를 사용한다. 이때, UUID를 사용하면 유용하다. UUID는 추정이 불가능한 랜덤 수를 만든다. 세션 ID가 생성되면, 세션 ID를 key, Member 객체를 value로 묶어 세션 저장소에 보관한다.

3. 생성된 세션ID를 클라이언트에 응답 쿠키로 전달한다
클라이언트와 서버는 쿠키로 연결된다. 서버는 mySessionId라는 이름으로 세션ID만 쿠키에 담아 클라이언트에 전달한다. 클라이언트는 쿠키 저장소에 mySessionId 쿠키를 보관한다. 중요한 사실은 mySessionId에 회원과 관련된 정보가 전혀 없다는 것이다. 유추가 불가능한 세션ID만 클라이언트에 쿠키로 전달된다.

4. 클라이언트의 세션ID 쿠키 사용
클라이언트는 요청 시, 항상 mySessionId 쿠키를 서버에 전달한다. 서버는 클라이언트가 보내온 mySessionId 쿠키 정보를 이용해, 세션 저장소를 조회한다. 매칭되는 정보가 있을 경우 로그인 인증에 사용한다.

별도의 세션ID를 생성하여 쿠키 값으로 사용하여, 아래와 같이 보안 문제를 해결했다.

  • 쿠키 값 변조 가능성 -> 유추가 불가능한 세션ID로 대체
  • 쿠키에 보관하는 정보가 직접 노출(ex. 회원 ID 등) -> 세션ID는 랜덤 값이므로, 중요한 정보가 없다
  • 쿠키 탈취 후 사용 -> 일정 시간이 지나면 사용할 수 없도록 서버에서 세션의 만료기간을 짧게 설정
profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글