[HTTP] 세션과 인증

JJBIN·2024년 3월 30일

HTTP

목록 보기
6/6

1. 세션

1) 쿠키 취약성

HTTP 통신은 무상태성을 가지기 때문에 상태를 유지하기 위해서 주로 쿠키를 사용한다.

쿠키는 클라이언트 측에서 관리되기 때문에 상대적으로 보안이 취약하다.

  • 쿠키가 안전하게 관리되지 않거나 혹은 XSS 공격 등으로 인해 쿠키가 탈취된다면 민감한 정보들이 그대로 노출된다.

  • HTTP 통신 과정에서 암호화를 한다고 하더라도 절대 해독이 불가능한 것은 아니다. 암호화된 메시지가 해독될 경우 쿠키가 그대로 노출된다.

  • 따라서 민감한 정보들을 쿠키에 담아 매번 전송하는 것은 안전하지 않다.

  • 쿠키는 클라이언트 측에서 관리되기에 노출된 사실을 서버에서 감지하기 어렵다.

따라서 민감한 정보(아이디, 비밀번호 등)들을 쿠키에 직접 저장하는 것은 바람직하지 않다.

그밖에도 쿠키에는 많은 양의 데이터를 담을 수 없다는 단점이 존재한다.


2) 세션

웹에서 세션(Session)이란 클라이언트와 서버 간의 상호 작용에 대한 상태 정보를 유지 관리하는 방법이다.

클라이언트와의 연결 정보를 서버에서 관리하기 떄문에 앞서 언급한 쿠키의 단점을 보완할 수 있다.

서버는 세션을 통해 로그인 정보, 장바구니 정보 등 서버가 기억해야 하는 클라이언트의 상태를 관리할 수 있다.

A. 인증 과정

  1. 클라이언트가 자격 증명(Credentials) 정보를 담아 로그인 요청을 하면 서버에서 검증한다.

  2. 클라이언트의 신원이 인증(Authenticated)되었다면 서버는 해당 연결에 대한 세션을 생성하고 별도의 세션 저장소(session storage)에 저장한다.

  3. 서버는 생성된 세션ID를 클라이언트에게 전달한다.

  4. 클라이언트는 이후 연결부터 (쿠키, HTTP 헤더, 쿼리, 바디 등에 담아) 세션ID를 함께 전달한다.

  5. 서버는 해당 세션 ID를 통해 세션을 찾고 유효성을 검증한다.

  6. 유효하다면 서버는 해당 세션을 통해 클라이언트의 상태를 획득할 수 있다.


B. 장단점

세션의 가장 큰 장점이자 단점은 서버에 의해 관리된다는 점이다. 이를 통해 얻게 되는 장단점을 알아보자.

장점

  • 쿠키에는 세션 ID만 담기기 때문에 중요한 정보가 클라이언트 측에 직접적으로 노출되지 않는다.
  • 의심 징후가 탐지될 경우 서버 측에서 세션을 강제로 만료시킬 수 있다.
  • 특정 사용자에 대한 세션을 서버에서 식별 가능하므로 중복 로그인 감지 및 관리가 가능하다.
  • 쿠키의 용량 제한에 구애받지 않고 클라이언트의 상태를 저장하고 행동을 추적할 수 있다.

단점

  • 서버에 세션을 저장하고 관리하므로 서버의 부하가 증가한다.

  • 확장(Scale Out)하기 어렵다. 서버에 클라이언트의 상태를 저장하기 때문에 분산 환경에서 세션에 대한 정합성을 보장하기 위한 별도의 기술이 필요하다.


C. 취약점: 세션 하이재킹

세션 하이재킹은 공격자가 피해자(클라이언트)의 세션ID를 탈취하여 사용하는 중간자 공격(man in the middle, MITM)의 일종이다.

세션 하이재킹을 방지하기 위해선 다음과 같은 방법들을 사용할 수 있다.

  • HTTPS를 통한 데이터 암호화

  • 세션의 유효기간을 적절하게 설정

  • 주기적으로 혹은 중요한 이벤트 발생 시 세션 ID를 새로 생성

  • 요청의 IP 주소를 검증하여 갑작스러운 요청 IP 주소 변경을 감지하여 세션 종료 혹은 추가 인증 요구



2. 분산 서버와 세션

HTTP의 장점 중 하나는 무상태성으로 인한 확장 용이성이다.

그런데 세션을 사용함으로써 서버는 클라이언트에 대한 상태를 기억하게 되었다.

이로 인해 scale out을 통한 서버 확장에 어려움이 존재한다.

1) 세션 정합성 문제

분산 서버 환경에서 클라이언트의 각 요청은 로드밸런서에 의해 적절하게 서버들로 분산된다.

이 때, 각 서버가 별도의 세션 저장소를 가지고 있기 때문에 다음과 같은 세션 정합성 문제가 발생한다.

  1. 클라이언트 C의 로그인 요청은 서버 A에 의해 처리되고 세션이 생성된다. (세션id = 1)

  2. C는 A로부터 전달받은 세션 ID를 사용하여 요청을 보낸다.

  3. 로드 밸런서에 의해 이 요청은 서버 B에 의해 처리된다.

  4. 하지만 B에서는 C가 전달한 세션ID에 해당하는 세션 정보를 찾을 수 없다.

  5. 결과적으로 B는 클라이언트에게 다시 로그인을 요구하게 된다.

2) 해결책

세션 정합성 문제를 해결하는 방법에는 크게 3가지 종류가 있다.

A. 스티키 세션

스티키 세션(Sticky Session)이란 클라이언트의 요청을 클라이언트와 처음 세션을 연결한 서버에게만 계속해서 전달하는 방법이다.

  • sticky(끈적)하게 세션을 유지중인 서버와 연결됨.

스티키 세션은 클라이언트의 IP혹은 쿠키 등을 이용하여 구현할 수 있다.

  • 로드밸런서가 IP, 쿠키 등을 통해 해당 클라이언트와 세션을 유지중인 서버를 식별한다.

쿠키를 사용하여 스티키 세션을 구현하는 방법을 살펴보자.

  1. 서버에 대한 정보를 세션ID와 함께 쿠키에 담는다.

  2. 로드 밸런서는 쿠키에서 서버 정보를 꺼내 확인한 뒤, 해당 서버에만 요청을 전송한다.

A) 문제점

  1. 특정 서버에 트래픽이 집중될 수 있다.

    • 로드밸런서는 단순히 트래픽을 골고루 분산시킬 뿐 해당 클라이언트와 서버의 세션이 얼마나 길게 유지될지는 알 수 없다.

    • 특정 서버와 연결된 클라이언트들이 유독 길게 세션을 유지한다면 로드 밸런싱을 함에도 특정 서버에만 트래픽이 집중될 수 있다.

  2. 특정 서버가 다운되면 해당 서버의 세션들이 소실된다. (복구 불가능)

    • 해당 서버와 연결된 클라이언트들은 다른 서버와의 세션을 새로 생성해야 한다.

    • 세션이 소실된 클라이언트들의 작업 진행 상황을 잃을 수 있다.

스티키 세션은 세션 정합성 문제를 해결할 수 있지만 적절한 부하 분산에 실패하거나 가용성을 확보하지 못할 수 있다.


B. 세션 클러스터링

세션 클러스터링(Session Clustering)이란 여러 서버들의 세션을 하나의 클러스터로 묶어 공유 및 동기화 하는 방법이다.

스티키 세션과 달리 어느 서버에 요청하더라도 세션을 획득할 수 있으므로 부하 분산이 잘 이루어지며 가용성이 더 높다.

크게 2가지 방식으로 구현할 수 있다.

1. 클러스터를 구성하는 모든 서버에 세션 복제

  • 모든 서버에 세션을 복제하므로 가용성이 높다.
  • 메모리 사용량이 많아진다.

2. 클러스터 내 일부 서버에만 세션 복제 후 나머지 서버에는 세션 아이디만 복제

  • 일부 백업 서버에만 실제 세션을 복제하기 때문에 메모리 사용량이 상대적으로 적다.
  • 세션 ID만 가지고 있는 서버와 통신할 경우 실제 세션을 획득하기 위한 네트워크 비용이 발생한다.
  • 세션을 가지고 있는 서버들(원본 및 백업 서버)이 동시에 다운될 경우 세션이 소실된다.

A) 문제점

1. 높은 메모리 사용량

  • 하나의 세션을 여러 서버에서 동시에 저장하므로 많은 메모리를 사용한다.

2. 세션 동기화 오버헤드

  • 세션 정보를 복제 및 전달하는 과정에서 추가적인 네트워크 비용과 지연이 발생한다.

3. 세션 정합성 문제 발생 가능성

  • 세션 정보가 전파되는 과정에서 지연으로 인해 세션 정보의 불일치가 발생할 가능성이 존재한다.

B) 정리

세션 클러스터링은 스티키 세션에 비해 고가용성을 확보하기 쉽다.

그러나 세션의 정합성을 보장하는 안정적인 클러스터를 구성하기 위해서 효율적인 동기화 알고리즘과 백업 및 복구 알고리즘을 갖추어야 한다.

정리하면 세션 클러스터링은 세션 정합성 문제를 해결하고 적절한 부하 분산 및 고가용성을 확보할 수 있다.

하지만 클러스터를 구성하기 위해 높은 메모리 사용량과 동기화 과정, 노드 추가로 인한 클러스터 업데이트 등 성능적인 희생을 감수해야 한다.


C. 외부 세션 저장소

세션의 정합성을 유지하기 위한 마지막 방법은 별도의 외부 세션 저장소(Session storage)를 운용하는 것이다.

외부 세션 저장소를 사용하면 각 서버들의 세션 정보를 동기화 하기 위한 오버헤드가 발생하지 않는다.

또한 서버와 세션이 분리되어 서버와 상관없이 세션의 가용성을 확보할 수 있다.

세션 저장소는 주로 redis와 같은 in-memory DB를 통해 구성된다.

세션의 특성상 영구적으로 저장될 필요가 없으며 속도가 중요하기 때문이다.

A) 문제점

1. 성능 감소

  • 매번 외부 저장소를 통해 세션을 조회해야 하므로 네트워크 트래픽이 증가한다.
  • 네트워크 지연으로 인한 병목지점이 될 수 있다.

2. 단일 장애 지점

  • 모든 세션을 한 곳에서 관리하기 때문에 외부 세션 저장소에 장애가 발생하면 모든 서버에 그 장애가 전파된다.
  • 이를 해결하기 위해서는 별도의 분산 처리를 통해 외부 세션 저장소의 고가용성을 확보해야 한다.

References

Subham Datta, 『What Are Sessions? How Do They Work?』, Baeldung
Graham Cox, 『API Authentication – Tokens vs Sessions』, Baeldung
Dhiraj Kumar, 『How to Prevent Session Hijacking?』, Baeldung
GeeksForGeeks, 『Session Hijacking』

Hudi, 『다중 서버 환경에서의 세션 불일치 문제와 해결방법』, hudi.blog
인파, 『세션(Session) 불일치 문제 및 해결 방법』, Inpa Dev

0개의 댓글