All case studies
GAIS — Government Advertising Integrated Support SystemKorea Press Foundation (KPF)Aug 2020 - Dec 2025 (5y 4m)

SECURITY / NETWORK

Rolling out TLS 1.3 with an Nginx reverse proxy

Touching the shared WebtoB SSL configuration felt too risky, so I placed Nginx in front as a reverse proxy and terminated TLS there. TLS 1.3 was rolled out without impacting the existing ERP integrations.

Applied TLS
1.0/1.1 → 1.3

Meets the security audit requirement

Strategy
SSL Termination

Nginx reverse proxy

Shared SSL impact
None

WebtoB configuration untouched

Per-domain control
Enabled

Independent TLS policies

NginxWebtoBJEUS (WAS)TLS 1.2/1.3Reverse ProxySSL Termination

Problem

The audit flagged TLS, but the only knob was shared SSL

During a security audit at the Korea Press Foundation (KPF), the GAIS (Government Advertising Integrated Support System) platform was flagged for still serving TLS 1.0/1.1. The seemingly easiest path was to bump the TLS version at the cloud WAF, but doing so could break the API traffic between the platform and internal ERP systems, so I could not raise it right away. The other lever was WebtoB's shared SSL configuration, which was even trickier — several JEUS containers shared the same SSL settings, so a global change would ripple across every connected development server. It was the classic "fix one thing, break everything else" setup.

  • Audit flagged TLS 1.0/1.1

    Production services had to be raised to TLS 1.2 or above

  • Changing the WAF needed ERP API compatibility checks first

    API traffic with internal systems had to be validated before flipping the switch

  • WebtoB shared SSL had a wide blast radius

    Multiple JEUS containers shared the same SSL settings — a global change risked a full outage

Approach

SSL termination via an Nginx reverse proxy

Instead of touching the global configuration, I placed Nginx in front as a reverse proxy and used it as the SSL termination point. The client ↔ Nginx leg runs TLS 1.2/1.3, while the Nginx ↔ WebtoB leg runs over internal HTTP (port 8099). This satisfies the security requirement while leaving the existing WebtoB/JEUS stack untouched.

AS-IS

TLS 1.0/1.1

Client (Browser)

HTTPS / 443

WebtoB

Web Server

  • TLS 1.0/1.1
  • Flagged for security weakness
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

  • Existing shared SSL config preserved
Internal

JEUS (WAS)

Enterprise Application

  • ERP Logic

Because WebtoB shares a single SSL configuration across multiple JEUS containers, any global TLS change that breaks internal API traffic impacts every connected development server at once. Putting Nginx in front isolates that risk and also makes it easy to manage TLS policies per domain.

Process

Implementation steps

  1. 01

    Install Nginx and configure SSL/TLS

    I installed Nginx on the target server and defined the certificate paths, TLS versions, and proxy forwarding headers in ssl_proxy.conf. I left only TLSv1.2 and TLSv1.3 under ssl_protocols, so the weaker earlier versions are rejected outright.

    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

    Switch the WebtoB http.m listener port

    The WebtoB virtual server that used to listen on 443 directly was switched to the internal port (8099) that Nginx forwards to. Nginx handles TLS termination while WebtoB's shared SSL configuration stays in place — a clean separation of responsibilities.

    http.m
    config
    # WebtoB http.m — switch from 443 to the internal port
    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", # previous: external 443 listener
    PORT = "8099", # new: internal port that Nginx forwards to
    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

    Roll out per domain, then validate the ERP APIs

    I raised the TLS version on a test domain first, verified that the main internal ERP APIs (query, create, update) still worked end-to-end, and once everything checked out, completed the TLS 1.3 rollout on the production servers.

Outcome

Outcome

  • TLS 1.3 rolled out without affecting existing services

    By moving TLS termination up to the Nginx layer instead of touching WebtoB's shared SSL configuration, the audit requirement (TLS 1.2 or higher) was satisfied with no impact on existing services.

  • TLS policies now managed independently per domain

    When a specific domain needs a different cipher suite or certificate — or needs to be tested in isolation — I can now do that without touching any of the other services.

MORE

Explore other cases

Badabom

AUTH / SSO

Building an SSO Provider for Partner Sites

Implemented an SSO Provider so external partner sites (e.g., OTT) could sign in with Badabom accounts. Single-use UUID tokens stored in the database support multiple WAS nodes, and CI (Connecting Information) auto-maps accounts across both sides.

View detail

Badabom

DEVOPS / OBSERVABILITY

SSE + Cross-WAS Real-Time Log Viewer

The WAS lived in the Daejeon IDC, but network-segregation policy meant only Busan-office PCs could reach it — so pulling a log effectively meant flying to Busan. I built an SSE-based viewer inside the admin web and added a cross-WAS relay so logs from both WAS nodes stream into a single screen.

View detail

Badabom

LEGACY MIGRATION

Migrating the OTT Technology-Trade System into Badabom

Moved an Oracle + MyBatis technology-trade platform (OTT) onto PostgreSQL + iBATIS. Rewrote 87 URLs, 34 JSPs, 80+ SQL queries, and 14 tables.

View detail

GAIS — Government Advertising Integrated Support System

CI/CD

Automating the Build and Deploy Pipeline

Replaced a fully manual build-and-deploy workflow with a Jenkins + GitLab Webhook pipeline, cutting deploy time from 15–20 min down to around 4 min.

View detail

GAIS — Government Advertising Integrated Support System

INFRA / SESSION

Redis-Backed Session Clustering

JEUS Standard doesn't support native session clustering, so I put Redis in front as an external session store. That unlocked rolling restarts across WAS nodes.

View detail

Freelance · Side Projects

CLIENT WORK / WEB

Pitched and Built a Postpartum Care Center Site Renewal

My wife had stayed at a postpartum care center whose website felt dated, so I mocked up a UI sample and pitched it myself. I built an Astro static site with a 192-frame scroll animation, Kakao Map, and SEO — then shipped it to their production domain.

View detail

Freelance · Side Projects

SIDE PROJECT / AI

Family-Driven Baby Naming with AI + Tournament-Style Voting

Existing naming services are designed for solo use, so I built a way for the whole family to join in. GPT-4o suggests names aligned with Saju (birth-chart) and Ohaeng (Five-Element) rules, and the family votes tournament-style to pick the final name.

View detail
TLS 1.3 Upgrade | Case Study