우리 서비스의 구조
우리는 현재 웹서비스(shop.wisely.store)를 운영하면서 다음과 같은 구조를 사용하고 있습니다.
사용자 브라우저 → WAF → CloudFront (AWS SSL 인증서 사용) → Vercel (Let's Encrypt 인증서 사용)
이러한 구조로 인해 SSL 인증서가 총 두 개 사용됩니다.
최근 갑자기 CloudFront가 502 Bad Gateway 에러를 내기 시작했습니다. 확인해보니 원인은 Vercel의 SSL 인증서가 만료되었기 때문이었습니다.
“하지만 왜 인증서가 만료되었을까?”
일반적으로 Vercel은 Let’s Encrypt의 ACME 프로토콜을 사용해 자동으로 인증서를 갱신합니다. 그러나 이번에는 자동 갱신이 실패했습니다. 이유는 다음과 같았습니다.
Vercel이 인증서를 갱신할 때 사용하는 ACME 클라이언트는 Let’s Encrypt에게 HTTP-01 챌린지 요청을 보내 도메인 소유권을 검증합니다. 이때 검증을 위한 URL은 다음과 같은 형식입니다.
<http://shop.wisely.store/.well-known/acme-challenge/{토큰값}>
그러나 우리의 구조는 CloudFront가 먼저 해당 도메인의 요청을 받고 있습니다. 만약 CloudFront가 HTTPS 요청만 허용하고 있거나 HTTP 요청을 리다이렉트하면, Let’s Encrypt의 HTTP-01 챌린지 요청이 Vercel까지 전달되지 못합니다.
즉, Vercel이 HTTP-01 챌린지 요청을 받을 수 없게 되어 도메인 소유권 검증이 실패하고, 결국 인증서가 갱신되지 못했던 것입니다.