Published on

Stateless 방식으로 사용자 데이터를 보호를 통한 개인적인 정리

Authors
  • avatar
    Name
    김민석
    Twitter

Introduction

상황

  • 이력서 피드백 서비스에서는 사용자가 자신의 이력서를 업로드하여 OpenAI API를 통해 실시간으로 피드백을 받는 기능을 제공하고 있다.
  • 여러 사용자가 동시에 접속할 수 있는 서비스 환경에서, 업로드된 이력서가 다른 사용자에게 노출될 가능성을 완전히 차단하는 것이 중요했다.

문제

image.png
  • 초기 구현은 상태를 유지하는 방식(stateful)으로 되어 있어, 서버에서 사용자 데이터를 일시적으로 저장하고 이를 통해 요청 간 상태를 유지하는 방식으로 동작했다.
  • 때문에, 여러 사용자가 동시에 접속할 경우 사용자의 이력서 데이터가 서버에 남아있는 동안 다른 요청에서 접근할 가능성이 생겼다.

원인

  • stateful 방식에서는 서버가 클라이언트의 상태 정보를 세션에 저장하여 요청 간에 상태를 유지한다.
  • 서버가 상태를 유지하는 구조에서는 상태 정보가 세션 또는 서버의 메모리에 저장되며, 이 정보가 명시적으로 분리되지 않으면 여러 사용자가 같은 정보를 동시에 접근할 가능성이 높아진다.
  • 예를 들어, 이력서를 서버에서 임시로 저장할 경우, 다른 사용자가 동일한 서버에 접근할 때 우발적으로 이 데이터에 접근할 수 있다.

해결

image.png

문제를 해결하기 위해 서버가 사용자의 상태를 유지하지 않는 stateless 방식을 도입했다.

HTTP의 Stateless 특성 (일반적인 개념 x 이상황에서의 적합한 개념 설명)

  • 서버가 각 요청을 독립적으로 처리하도록 한다. 즉, 요청 간에 상태 정보를 저장하지 않고, 각 요청이 새로운 연결로 처리되는 방식이다.
  • 서버는 클라이언트의 이전 요청에 대한 정보를 기억하지 않으므로, 사용자는 매번 필요한 정보를 함께 보내야 한다. 이렇게 함으로써 서버는 특정 사용자의 상태를 유지하지 않고, 모든 요청을 독립적으로 처리할 수 있게 되는 것이다.
  • 이와 같은 Stateless 방식 덕분에, 서버는 다수의 사용자로부터 동시에 들어오는 요청을 효율적으로 처리할 수 있다. 각 요청은 독립적이므로 서버는 한 사용자의 요청이 끝난 후 해당 정보를 저장할 필요가 없다.
  • 이러한 방식은 클라이언트와 서버 사이의 연결이 매우 많더라도 서버의 메모리나 자원을 절약할 수 있도록 도와주는 것이다.

예시 설명

만약 사용자 A와 사용자 B가 각각 서버에 이력서를 업로드하여 피드백을 요청할 때, 서버는 이들의 요청을 전혀 연관 짓지 않고 처리한다.

  1. 사용자 A가 파일을 업로드하면 서버는 그 파일을 임시로 생성하고 피드백을 처리한 후 즉시 삭제한다.
  2. 이어서 사용자 B의 요청이 들어오면, 서버는 A의 정보를 전혀 알지 못한 채 B의 파일을 새로 처리하고 삭제한다.

Stateless 방식에서는 서버가 사용자 A나 B에 대한 상태를 유지하지 않기 때문에, 독립적인 요청 처리가 가능해지고, 동시에 다수의 사용자 요청도 문제 없이 관리할 수 있다.

이러한 특성 덕분에 이력서와 같은 민감한 정보가 보호되고, 사용자 간의 데이터 노출 위험도 줄일 수 있다.

  • 임시 파일 생성 및 즉시 삭제: 파일을 서버에서 영구적으로 저장하지 않고, 업로드된 파일을 일시적으로 생성하고 필요할 때만 처리한 후, 즉시 삭제하도록 구현했다.
  • 독립적인 요청 처리: 모든 요청은 이전 요청의 데이터를 참조하지 않고 독립적으로 처리된다.
// 파일을 임시로 생성하고 작업 종료 시 즉시 삭제하는 방식
String resumeContent = extractResumeContent(file);
if (resumeContent == null) {
    return ResponseEntity.badRequest().body(Map.of("error", "지원하지 않는 파일 형식입니다"));
}

String initialFeedback = openAiService.getDetailedFeedback(resumeContent);

결과

  • Stateless 방식을 도입한 결과, 서버가 사용자의 상태 정보를 전혀 유지하지 않게 되어 각 요청이 독립적 으로 처리된다.
  • 이를 통해, 이력서와 같은 민감한 정보가 다른 사용자에게 노출될 가능성을 차단했다.
  • 독립적으로 처리되는 각 요청이 서버에 상태를 남기지 않으므로 보안성이 크게 향상되었다.