HTTPS를 왜 도입하게 되었을까요?
- 모두모여라 사이트에 보안상의 이유와 프로젝트 요구사항으로 인해 HTTPS를 적용하고자 하였습니다.
- HTTP만을 사용하기에는 HTTP 메시지를 누구나 볼 수 있다는 문제점도 있고, 웹브라우저 자체에서 HTTP가 안전하지 않다고 표시되는 부분이 조금 신경쓰였습니다.
SpringBoot 설정 vs Nginx 설정 비교
HTTPS 적용에 앞서 HTTPS를 어떻게 적용해야 할 지 고민하였습니다. HTTPS 설정을 SpringBoot에서도 설정해 줄 수 있었고, Nginx에서도 설정할 수 있었습니다. SpringBoot에서 적용하나, Nginx에서 적용하나 간단하게 적용할 수 있었습니다. 둘 중 어느 방식을 사용해야 하는지 찾아보고 고민해 보았습니다.
먼저 SpringBoot에서의 설정입니다. yml 파일을 설정하는 방식으로 간단하게 적용 가능합니다.
server:
ssl:
key-store: classpath:keystore.p12
key-store-password: password
key-store-type: pkcs12
key-alias: springboot
key-password: password
port: 8443
다음으로 Nginx에서의 설정 방식입니다. 기존 설정에 ssl 관련 설정을 추가하는 방식으로 간단하게 적용 가능합니다.
ssl on;
server_name www.sslcert.co.kr;
ssl_certificate_key /파일경로/~~.pem;
ssl_certificate /파일경로/~~.pem;
Nginx와 SpringBoot 설정 자체는 둘 다 그렇게 복잡하지 않은 것 같습니다. 그렇다면 현재 프로젝트에 맞는 설정은 무엇인지 고민하고 적용해 보겠습니다.
모모 팀 프로젝트 아키텍처
- 현재 프로젝트에서는 Nginx를 각각 앞단에 두어 프론트와 백을 배포하고 있었습니다.
- 팀에서는 Nginx에 SSL을 적용하도록 결정하였습니다.
왜 Nginx에 SSL을 두었을까?
- SpringBoot에 SSL을 두게 되면, Nginx를 없애야 합니다.
- 사용자는 Nginx에 접근하고 Nginx에서 서버로 접근하기 때문입니다.
- 처음엔 두 가지 방식 모두 적용 가능했습니다. 마음만 먹으면 Nginx를 제거할 수도 있는 등 Nginx를 자유롭게 사용할 수 있었기 때문입니다. 하지만 추후 저희 프로젝트에서는 Nginx를 사용하여 로드 밸런싱을 하였는데, 이 과정에서 다음 두 가지 이유로 인해 Nginx로 고정되게 되었습니다.
- 모든 서버에서 인증서와 비밀키를 가지고 있어야 할 필요가 있을까요?
- 클라이언트 ↔ Nginx, Nginx ↔ WAS 구조가 될 텐데, 스프링 부트에 SSL을 걸게 되면 클라이언트에서 Nginx로 접근하려고 할 때는 HTTP 요청이지 않을지.. 오히려 클라이언트에서 NginX로 전달하는 HTTP 메시지를 암호화하는 것이 의미가 있는 것이 아닐까요?
HTTPS의 문제점??
- 그렇다면 HTTPS를 도입하기 전에.. HTTPS를 도입했을 때의 문제점은 없나 찾아 보았습니다.
- 성능 상의 문제, HTTPS는 HTTP 대비 느리다는 말이 있었습니다.
- SSL 핸드셰이크, 전송 전후로 암복호화가 일어난다면 속도 차이가 있을 것 같았습니다.
- 실제로 어느정도의 속도 차이가 있을지 테스트를 진행해 보겠습니다. 이 때 접근 대상은 API 문서에 대한 접근 테스트입니다.
- 먼저, HTTPS를 사용했을 경우의 응답 시간입니다.
- 다음으로, HTTP를 사용했을 경우의 응답 시간입니다.
결론
- 예상한 대로 HTTPS가 대략 1ms정도 느린 결과가 도출되었습니다.
- 목표로 하는 동시 접속 인원수가 적어 1ms정도의 시간은 개인적으로 고려해야 할 정도는 아니라고 판단되었습니다. 이 부분은 팀적으로도 동의되어 HTTPS를 적용하는 쪽으로 결정하였습니다.