SSL Termination

김유경·2025년 6월 8일

들어가며

SSL Termination은 SSL 암호화 트래픽을 백엔드 서버로 전달하기 전에, 로드밸런서(ALB)에서 암호화를 해제하고 HTTP로 전달하는 방식입니다. 이 방식은 SSL 처리 부담을 백엔드가 아닌 ALB가 담당하기 때문에 서버 부하를 줄일 수 있고, 인증서도 ALB에만 설치해 관리할 수 있다는 장점이 있습니다.

😃 이번 글에서는 이 구조를 선택한 이유와 그 과정에서 발생한 작은 이슈와 해결 방법을 공유하고자 합니다.


SSL 터미네이션 방식

사용자 → HTTPS (443) → ALB → HTTP (80) → 서버

장점

  • 백엔드 서버에 SSL 설정 불필요
  • 인증서 관리가 ALB에 집중됨
  • 서버 부하 감소
  • 기존 HTTP 백엔드 유지 가능

💡 왜 SSL 터미네이션을 선택했을까?

개발 과정에서 HTTPS 전환을 빠르게 적용해야 하는 상황이었기 때문에, 복잡한 설정 없이 로드밸런서에만 인증서를 설치하는 방식을 먼저 선택했습니다.

물론, 모든 구간을 암호화하는 End-to-End 방식보다는 보안 수준이 낮을 수 있지만, 현재 구조는 내부 네트워크에서만 통신이 이뤄지기 때문에 큰 문제가 없다고 판단했습니다.

자세한 설정 방법은 이 글을 참고해 주세요!


발생한 문제와 해결 과정

🚨 문제 요약: 리다이렉트가 HTTP로 발생

카카오 로그인 연동 과정에서, Spring Boot가 HTTP URL로 리다이렉트하여 인증 흐름이 중단되는 문제가 발생했습니다.

📌 원인

  • ALB가 백엔드로 요청을 전달할 때 X-Forwarded-Proto: https 헤더를 포함하지 않음
  • Spring Boot는 해당 헤더가 없으면 HTTP 요청으로 오인
  • 결과적으로 OAuth 리다이렉트 URL을 http://로 생성함

‼️ HTTPS와 HTTP 혼용 현상

  1. 사용자가 https://api.playus.o-r.kr/login으로 접속
  2. 카카오 OAuth 인증 성공 → Spring이 /login으로 리다이렉트 시도
  3. 생성된 리다이렉트 URL: http://api.playus.o-r.kr/login → 브라우저가 보안상 차단

⚙️ 해결 방법: ALB 설정 변경

ALB의 X-Forwarded-Proto 전송 옵션을 사용으로 변경하면 해결됩니다.

변경 전후 흐름 비교

변경 전: 브라우저 --HTTPS--> ALB --HTTP (헤더 없음)--> Spring
변경 후: 브라우저 --HTTPS--> ALB --HTTP + X-Forwarded-Proto: https--> Spring

이제 Spring Boot는 HTTPS 요청임을 인식하고, OAuth 리다이렉트를 https:// URL로 생성합니다.

🌱 Spring 설정 추가

Spring Boot에서도 전달된 헤더를 인식할 수 있도록 다음 설정이 필요합니다.

# application.yml
server:
  forward-headers-strategy: framework

참고: X-Forwarded 헤더란?

X-Forwarded-* 헤더는 로드밸런서나 프록시가 원래 요청 정보를 백엔드 서버에 전달하기 위해 추가하는 표준 헤더입니다. HTTPS → 프록시(ALB) → HTTP 환경으로 바뀌더라도, 원래의 요청 정보를 보존할 수 있게 해줍니다.

X-Forwarded-Proto

  • 클라이언트가 HTTP 또는 HTTPS 중 어떤 프로토콜로 요청했는지 백엔드에 전달

X-Forwarded-Port

  • 클라이언트가 요청에 사용한 실제 포트 번호(예: 443)를 전달

X-Forwarded-For

  • 클라이언트의 실제 IP 주소를 백엔드에 전달

0개의 댓글