2023-02-20,   Do-soo, KIM

이번 포스팅에서는 보안 서버(https 서버)와의 통신을 위한 간단한 내용을 소개하고자 합니다.

최근, 개인정보 유출이나 해킹 등의 피해가 늘어나면서 보안의 중요성이 매우 높아지고 있습니다.

Google은 사이트의 컨텐츠와 상관없이 HTTPS를 도입하여 웹사이트에 접속하는 사용자를 보호할 것을 권장하고 있습니다.

즉 보안 강화를 위해 웹서비스는 HTTPS를 적용할 수 밖에 없는 것입니다.

이번 포스팅에서는 HTTPS(HyperText Transfer Protocol Over Secure Socket Layer)에 대한 자세한 설명은 할 수 없지만 간단히 소개하자면 우리가 잘 알고 있는 HTTP(HyperText Transfer Protocol)에 보안을 강화한 전송 기능 정도라고 생각하면 됩니다.

따라서 https://로 시작하는 도메인은 보안이 적용된 서버이므로 보다 안전하다고 보면 될 것 같습니다.

1. SSL 인증서


눈치가 빠르시다면 위에서 언급한 HTTPS의 풀네임에서 눈치 챘듯이 Secure Socket Layer를 SSL이라고 하고, 웹서버와 웹사이트에서 이루어지는 모든 정보 전송을 https 암호화 프로토콜을 통해 안전하게 전송되도록 하는 인증서가 바로 SSL 인증서입니다.

즉, SSL 인증서는 클라이언트와 서버가 SSL 통신을 하는데 있어 제3자가 보증을 해 주는 전자문서 입니다.

이 인증서의 역할은 클라이언트가 접속한 서버가 신뢰할 수 있는 서버인지 판단하고 SSL 보안 통신에 사용되는 서버측 공개키를 클라이언트에게 전달하는 것입니다. 이 인증서에는 사이트의 정보(CA, 도메인), 서버측 공개키가 포함되어 있습니다.

2. Self Signed Certificate


Web Server에서 https 서비스를 제공하려면 VeriSign과 같은 공인 기관을 통해 SSL 인증서를 발급받아 Web Sever에 설치하여야 합니다.

하지만, 공인 기관을 통한 인증서 발급은 비용이 발생하므로 서비스 운영이 아닌 개발 진행의 목적으로 사용하고 싶다면 비용 부담 없이 Self Signed Certificate를 생성하여 SSL 인증서를 발급받아 사용할 수 있습니다.

보통의 인증서는 개인키와 공개키가 쌍을 이루어 만들어진 다음 공개키를 인증기관의 개인키로 전자서명을 한 인증서로, 모든 인증서는 인증기관(CA)가 존재하지만 최상위 인증기관(Root CA)는 상위의 인증기관이 없기 때문에 Root CA의 개인키로 스스로의 인증서에 서명을 하여 Root CA 인증서로 사용하게 됩니다. 이렇게 스스로 서명한 Root CA 인증서를 Self Signed Certificate(SSC)라고 합니다.

서버는 이 SSC를 클라이언트에게 전달해 주며 클라이언트는 서버로부터 전달받은 인증서를 root 인증 저장소(cacerts)에 있는 Root CA 인증서로 신뢰성 검증을 하게 됩니다.

만약 클라이언트의 cacerts에 서버로부터 전달받은 인증서를 검증할 root CA 인증서가 없다면 신뢰성 검증을 할수 없어서 통신이 불가능하므로, 클라이언트는 반드시 cacerts에 Root CA 인증서를 등록해야 합니다.

자바 클라이언트를 예를 들면, 다음과 같이 Root CA 인증서를 등록할 수 있습니다.

keytool -importcert -alias "등록할 별칭" -keystore "cacerts path" -file "Root CA 인증서"

keytool은 Keystore 기반으로 인증서와 키를 관리할 수 있는 커맨드 방식의 유틸리티로 JDK에 포함되어 있습니다.

이번 포스팅은 여기까지 입니다.

Reference

https://help.campaignus.me/article/339-ssl-version
https://gentlysallim.com/ssl%EC%9D%B4%EB%9E%80-%EA%B2%8C-%EB%AD%90%EA%B3%A0-https%EB%9E%80-%EA%B1%B4-%EC%99%9C-%ED%95%84%EC%9A%94%ED%95%A8/
https://cert.crosscert.com/ssl-%ec%a0%95%ec%9d%98/
https://m.blog.naver.com/leejongcheol2018/221449121802
https://www.lesstif.com/java/java-keytool-keystore-20775436.html

업데이트: