모든 케이스 스터디
정부광고통합지원시스템한국언론진흥재단2020.08 - 2025.12 (5년 4개월)

SECURITY / NETWORK

Nginx 리버스 프록시로 TLS 1.3 적용

공용 WebtoB SSL 설정을 건드리기 부담스러워서, 앞단에 Nginx를 세우고 거기서 TLS를 종단하도록 구조를 바꿨습니다. 기존 ERP 연동에 영향 없이 TLS 1.3을 적용했습니다.

적용 TLS
1.0/1.1 → 1.3

보안 감사 요구 충족

전략
SSL Termination

Nginx 리버스 프록시

공용 SSL 영향
없음

WebtoB 설정 그대로

도메인별 제어
가능

독립 TLS 정책

NginxWebtoBJEUS (WAS)TLS 1.2/1.3Reverse ProxySSL Termination

Problem

TLS 지적은 받았는데, 건드릴 곳이 공용 SSL 뿐이었음

보안 감사에서 "TLS 1.0/1.1을 아직 쓰고 있다"는 지적을 받았습니다. 한 눈에 가장 쉬워 보이는 경로는 클라우드 WAF에서 TLS 버전을 바꾸는 거였는데, 이걸 건드리면 내부 ERP와의 API 통신에 영향이 갈 수 있어서 바로 못 올리는 상황이었습니다. 다른 한쪽에는 WebtoB 공용 SSL이 있었는데 이게 더 까다로웠어요 — 여러 JEUS 컨테이너가 같은 SSL 설정을 공유하고 있어서, 전역으로 바꾸면 연결된 개발 서버들까지 전부 영향권에 들어갑니다. "이거 고치려다 다른 거 다 깨지는" 전형적인 구조였습니다.

  • 보안 감사에서 TLS 1.0/1.1 지적

    운영 서비스의 TLS 버전을 1.2 이상으로 올려야 함

  • WAF에서 바꾸면 ERP API 영향 확인 필요

    내부 시스템과의 API 통신 호환성을 먼저 검증해야 하는 상황

  • WebtoB 공용 SSL은 범위가 큼

    여러 JEUS 컨테이너가 같은 SSL 설정을 공유 — 전역 변경은 전체 장애 위험

Approach

Nginx 리버스 프록시 기반 SSL Termination

전역 설정을 건드리는 대신 Nginx를 리버스 프록시로 세워서 SSL Termination 지점으로 썼습니다. 클라이언트 ↔ Nginx 구간은 TLS 1.2/1.3으로, Nginx ↔ WebtoB 구간은 내부 HTTP(8099)로 구성했습니다. 보안 요구사항은 충족하면서 기존 WebtoB/JEUS 구조는 그대로 두는 접근입니다.

AS-IS

TLS 1.0/1.1

Client (Browser)

HTTPS / 443

WebtoB

Web Server

  • TLS 1.0/1.1
  • 보안 취약점 지적
Internal

JEUS (WAS)

Enterprise Application

  • ERP Logic

TO-BE

TLS 1.2 / 1.3

Client (Browser)

HTTPS / 443

Nginx

Reverse Proxy

  • SSL Termination
  • ssl_protocols TLSv1.2 TLSv1.3
HTTP / 8099

WebtoB

Web Server

  • 기존 공용 SSL 설정 유지
Internal

JEUS (WAS)

Enterprise Application

  • ERP Logic

WebtoB가 여러 JEUS 컨테이너와 하나의 SSL 설정을 공유하다 보니, TLS를 전역으로 바꿀 때 내부 API 통신에 문제가 생기면 연결된 개발 서버 전체가 영향을 받습니다. Nginx를 앞단에 두면 그 리스크를 격리할 수 있고, 도메인별로 TLS 정책을 따로 관리하기도 편합니다.

Process

구현 단계

  1. 01

    Nginx 설치 및 SSL/TLS 설정

    대상 서버에 Nginx를 설치하고 ssl_proxy.conf에 인증서 경로·TLS 버전·프록시 전달 헤더를 정의했습니다. ssl_protocols에는 TLSv1.2·TLSv1.3만 남겨, 취약한 이전 버전은 아예 받지 않도록 했습니다.

    ssl_proxy.conf
    nginx
    # /etc/nginx/conf.d/ssl_proxy.conf
    server {
    listen 443 ssl;
    server_name devtest.goad.or.kr;
     
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/private.key;
    ssl_protocols TLSv1.2 TLSv1.3;
     
    location / {
    proxy_pass http://127.0.0.1:8099;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
  2. 02

    WebtoB http.m 수신 포트 변경

    기존에 443으로 직접 받던 WebtoB 가상 서버의 포트를, Nginx가 프록시로 넘겨주는 내부 포트(8099)로 바꿨습니다. SSL 종단은 Nginx가 맡고, WebtoB의 공용 SSL 설정은 그대로 두는 역할 분리 구조입니다.

    http.m
    config
    # WebtoB http.m — 443에서 내부 포트로 변경
    v_issga_dev_test_ssl
    DOCROOT = "/kpf_data/docroot/issga_dev_test",
    HOSTNAME = "devtest.goad.or.kr",
    HOSTALIAS = "10.30.10.12,175.45.222.244",
    # PORT = "443", # 기존: 외부 443 수신
    PORT = "8099", # 변경: Nginx가 프록시로 전달하는 내부 포트
    SSLFLAG = Y,
    SSLNAME = "ssl_issga",
    ServiceOrder = "ext,uri",
    ERRORDOCUMENT = "400,401,403,404,405,406,503",
    METHOD = "GET, POST, HEAD, -OPTIONS",
    LOGGING = "acc_issga_dev_test",
    ERRORLOG = "err_issga_dev_test",
    NodeName = "tmax"
  3. 03

    도메인별 적용 후 ERP API 검증

    테스트 도메인부터 TLS 버전을 올린 뒤 내부 ERP 주요 API(조회·등록·수정)가 정상 동작하는지 확인했고, 문제 없는 걸 확인한 다음 운영 서버에 TLS 1.3 적용을 완료했습니다.

Outcome

결과

  • 기존 서비스 영향 없이 TLS 1.3 적용

    WebtoB 공용 SSL 설정을 건드리지 않고 Nginx 계층에서 TLS를 종단하는 구조로 바꿔, 보안 감사 요구(TLS 1.2 이상)는 충족하면서 기존 서비스에는 영향이 없었습니다.

  • 도메인별로 TLS 정책을 따로 관리 가능

    특정 도메인만 암호화 스위트나 인증서를 바꾸거나 테스트해야 할 때, 다른 서비스를 건드리지 않고 작업할 수 있는 구조가 됐습니다.

MORE

다른 케이스 살펴보기

바다봄

AUTH / SSO

외부 사이트용 SSO Provider 구축

OTT 등 외부 기관 사이트에서 바다봄 계정으로 로그인하도록 Provider를 직접 구현했습니다. 일회용 UUID 토큰을 DB에 저장해 다중 WAS를 지원하고, CI(개인 공통 식별자) 기반으로 양쪽 계정을 자동 매핑합니다.

자세히 보기

바다봄

DEVOPS / OBSERVABILITY

SSE + Cross-WAS 실시간 로그 뷰어

WAS는 대전 IDC에 있는데, 망분리 정책상 그 서버에 붙을 수 있는 PC가 부산 사무실에만 있었습니다. 그래서 로그 한 번 보려면 사실상 부산으로 가야 하는 구조였어요. 관리자 웹 안에 SSE 기반 뷰어를 만들고, 두 개 WAS 노드 로그까지 Cross-WAS 릴레이로 한 화면에서 보이도록 구성했습니다.

자세히 보기

바다봄

LEGACY MIGRATION

OTT 기술거래 시스템을 바다봄으로 이관

Oracle + MyBatis 기반의 OTT 기술거래 플랫폼을 PostgreSQL + iBATIS 환경으로 옮겼습니다. 87개 URL, 34개 JSP, 80여 개 SQL과 14개 테이블을 재작성했습니다.

자세히 보기

정부광고통합지원시스템

CI/CD

빌드·배포 프로세스 자동화

전부 수동으로 하던 빌드·배포를 Jenkins + GitLab Webhook 기반으로 자동화해서, 배포 시간을 15~20분에서 4분대로 줄였습니다.

자세히 보기

정부광고통합지원시스템

INFRA / SESSION

Redis 기반 세션 클러스터링

JEUS Standard에서는 세션 클러스터링 기능을 못 써서, Redis를 외부 세션 저장소로 두고 우회했습니다. 덕분에 WAS 순차 재기동이 가능해졌습니다.

자세히 보기

프리랜서 · 사이드 프로젝트

CLIENT WORK / WEB

산후조리원 홈페이지 리뉴얼 제안 → 제작

아내가 입소한 조리원의 홈페이지가 오래돼 보여서 직접 UI 샘플을 만들어 제안했습니다. 192프레임 스크롤 애니메이션, 카카오맵, SEO까지 갖춘 Astro 정적 사이트를 제작해서 실제 운영 도메인으로 배포했습니다.

자세히 보기

프리랜서 · 사이드 프로젝트

SIDE PROJECT / AI

AI 작명 + 이상형 월드컵으로 가족이 함께 고르는 아기 이름

기존 작명 서비스가 혼자 쓰는 구조여서, 가족이 같이 참여할 수 있는 방식을 만들었습니다. GPT-4o가 사주·오행 맞춰 이름을 추천하면, 이상형 월드컵으로 가족이 투표해서 최종 이름을 고릅니다.

자세히 보기