📖 ✏️
이 글은
쿠키 기반의 로그인 인증 시 발생할 수 있는 보안 문제
와세션을 이용한 해결 방법
을 학습하고 정리한 포스팅이다.
쿠키는 클라이언트가 서버에 요청을 보낼 때, 간편하게 이용할 수 있는 식별 값이다. 쿠키는 대부분의 클라이언트 웹브라우저가 지원하는 방식이고, 모든 클라이언트 요청에 쿠키 정보가 함께 전달되므로 활용도가 좋다. 하지만 이용자를 식별할 수 있는 핵심 정보를 쿠키 값으로 사용하게 될 경우 치명적인 보안 문제가 발생한다. 쿠키 방식의 인증 처리는 어떠한 보안 문제가 있으며, 이를 해결할 수 있는 대안은 무엇인지 알아보자.
쿠키를 사용하면, 간단하게 사용자를 식별하고 로그인 상태를 유지할 수 있다. 하지만, 개발자가 생성하여 부여하는 쿠키 값은 필연적으로 규칙성을 갖게 된다. 규칙성은 유추를 가능케 하므로 아래와 같이 의도적으로 규칙성을 악용한다면 다른 사용자의 접근 권한을 얻을 수 있다.
쿠키 값의 변경으로 인해 발생하는 보안 문제
- 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다.
- 웹브라우저는 개발자모드에서 Cookie 값을 간단한게 변경할 수 있다.
- 예를 들어
memberId=1
이라는 쿠키 값을memberId=2
로 수정하면 서버는 다른 사용자로 인식한다.
만약, 쿠키에 개인 정보나 금융 정보를 집적 저장하거나, 쿠키 값을 이용해 중요한 정보를 조회할 수 있다면 보안에 심각한 문제가 생긴다. 쿠키는 네트워크 전송 구간에서도 탈취가 가능하기 때문에 더욱 보안에 취약하다.
쿠키 방식은 외부에 쉽게 노출되기 때문에 보안 문제에 취약했다. 하지만, 인증을 위해서는 클라이언트가 쿠키 저장소에 저장된 쿠키 값을 입장권처럼 사용할 수 있어야 한다. 이 문제를 어떻게 해결해야 할까?
클라이언트에게 쿠키 값을 부여한다는 기존의 아이디어를 유지한 채, 실제 전달하는 쿠키 값은 유추가 불가능한 랜덤 값을 사용하면 된다. 이와 같은 랜덤 값을 토큰이라 한다. 중요한 정보는 서버에 보관하고, 해당 정보와 매칭되는 토큰을 생성하여 클라이언트에 쿠키 값으로 전달한다. 토큰은 랜덤하게 생성되므로, 외부에 노출되어도 조작이나 예측이 거의 불가능하다. 이와 같은 방식을 세션이라 한다.
클라이언트에 전달하는 토큰은 만료 시간을 지정할 수 있다. 만료 시간을 짧게 설정하고, 주기적으로 토큰 값을 교체하여 보안 문제를 해결할 수 있다.
세션 방식은 쿠키 방식과 어떤 차이가 있을까? 로그인 과정을 단계적으로 살펴보며, 세션 방식의 동작 원리를 파악해보자.
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를 생성하여 쿠키 값으로 사용하여, 아래와 같이 보안 문제를 해결했다.