<aside> 💡

</aside>

1. 개요

본 프로젝트에서는 사용자의 위치 정보 및 마이크 음성 데이터를 활용하는 기능을 포함하고 있습니다. 브라우저 보안 정책상 이러한 민감 데이터 접근은 오직 HTTPS 환경에서만 허용되므로 Nginx를 활용하여 **SSL Termination(SSL 종단점)**을 구축함으로써 보안 이슈를 해결하고 개발 효율성을 극대화하였습니다.

2. 문제 상황 (Context)

초기 배포 단계에서 HTTP 프로토콜을 통해 서비스에 접속하였을 때 다음과 같은 기술적 제약이 발생하였습니다.

3. 해결 방안: Nginx SSL Termination

백엔드 어플리케이션(Spring Boot)에 직접 SSL 설정을 적용하는 대신 인프라 최전방의 Nginx가 복잡한 암호화/복호화 과정을 전담하도록 구성하였습니다.

3.1 Nginx의 역할 및 동작 원리

Nginx는 외부와 통신할 때는 암호화된 HTTPS로 통신하고, 서버 내부의 컨테이너와 통신할 때는 가벼운 HTTP로 전달하는 중계 역할을 수행합니다.

  1. 인증서 관리: Certbot 및 Let's Encrypt를 통해 443 포트에 SSL 인증서를 적용하였습니다.
  2. 복호화 수행: 클라이언트로부터 들어온 암호화된 데이터 패킷을 Nginx가 수신하여 복호화합니다.
  3. 내부 전달: 복호화된 트래픽을 호스트 내부 네트워크(127.0.0.1)를 통해 Docker 컨테이너(3000, 8080 포트)로 전달합니다.

4. 상세 구현 내용

4.1 Nginx 설정 구성

/etc/nginx/sites-available/default 파일을 다음과 같이 구성하여 SSL 종단점을 설정하였습니다.

server {
    listen [포트지정] ssl; # [포트지정] 포트로 암호화된 요청을 수신합니다.
    server_name [도메인IP];

    # SSL 인증서 경로 설정
    ssl_certificate /etc/letsencrypt/live/[도메인IP]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[도메인IP]/privkey.pem;

    location / {
        proxy_pass <http://127.0.0.1:3000>; # 내부 통신은 가벼운 HTTP를 유지합니다.
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme; # 원본 프로토콜이 HTTPS임을 전달합니다.
    }
}

4.2 방화벽 및 인프라 보안