브라우저는 운영체제(OS) 인증서 저장소를 사용하고, Java 서버는 자체 cacerts 저장소를 사용하기 때문에 이런 차이가 생깁니다.
1. 문제 상황
브라우저에서는 홍수통제소 Open API 같은 HTTPS 사이트가 잘 열리지만, Java 서버(Spring Boot 배치 등)에서는 PKIX path building failed 오류가 발생할 수 있습니다.
2. HTTPS 신뢰 구조
- 서버는 SSL 인증서와 중간 인증서를 제시합니다.
- 클라이언트는 루트 CA까지 체인을 검증해야 합니다.
- 운영체제/브라우저/JDK는 “모든 인증서”를 저장하는 게 아니라, 루트 CA 몇십~몇백 개만 저장합니다.
3. 브라우저 vs Java
| 환경 | 참고하는 저장소 | 특징 |
|---|---|---|
| 브라우저(Vue 포함) | 운영체제 저장소 | OS 업데이트로 최신 CA 자동 반영 |
| Flutter 앱 | 안드로이드/iOS 저장소 | 모바일 OS 인증서 사용 |
| Java 서버 | cacerts |
JDK 배포판 포함 CA만 사용 → 부족할 수 있음 |
4. 왜 문제가 생겼나?
홍수통제소가 사용하는 루트 CA가 Java cacerts에 없었기 때문입니다. 브라우저는 OS 저장소를 쓰므로 괜찮지만, Java는 직접 추가해야 합니다.
5. 해결 방법
# 서버 인증서 체인 확인
openssl s_client -connect api.example.go.kr:443 -showcerts
# 필요한 CA 인증서를 저장 후 Java에 import
keytool -importcert -file RootCA.crt -alias rootca \
-keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
운영 환경에서는 별도의 truststore를 만들어 JVM 옵션에 지정하는 것이 더 안전합니다:
java -Djavax.net.ssl.trustStore=/path/to/truststore.jks \
-Djavax.net.ssl.trustStorePassword=비밀번호 \
-jar app.jar
6. FAQ
Q. JDK는 Oracle 것만 있나요?
아닙니다. OpenJDK, Temurin, Corretto, Zulu 등 다양한 배포판이 있습니다.
Q. 루트 CA가 수억 개인가요?
아닙니다. 보통 수십~수백 개 정도입니다.
Q. Vue/Flutter도 CA를 따로 넣어야 하나요?
보통 필요 없습니다. OS/브라우저가 관리합니다.
'개발' 카테고리의 다른 글
| 웹서버, WAS, 톰캣, JEUS의 관계 완전 정리 (0) | 2025.11.03 |
|---|---|
| 💡화이트리스트 기반 파일 업로드 구현 (0) | 2025.10.31 |
| React + Capacitor로 안드로이드 앱 실행하기 (Android Studio) (1) | 2025.07.30 |
| Vue.js에서 URL 쿼리로 테이블 정렬 상태 기억하기 - 새로고침에도 유지돼는 UX 만들기 (0) | 2025.07.21 |
| CORS 정책 정리: 웹 API 개발자가 꼭 알아야 할 개념 (Spring 기준) (0) | 2025.07.14 |