네이버 클라우드와 Let's Encrypt를 이용한 HTTPS 구현

inguk·2024년 8월 4일
0
post-thumbnail
post-custom-banner

안녕하세요! 오늘은 네이버 클라우드 환경에서 Let's Encrypt를 사용하여 SSL 인증서를 발급받고 HTTPS를 구현하는 방법에 대해 공유하려고 합니다. 이 과정에서 nginx, certbot, 프록시 서버 설정 등 다양한 기술을 사용했는데, 이를 통해 얻은 경험과 해결한 문제들을 여러분과 나누고자 합니다.

HTTP vs HTTPS: 왜 HTTPS를 사용해야 하는가?

HTTP와 HTTPS의 차이:

  • HTTP: 평문 통신으로 데이터 노출 위험
  • HTTPS: SSL/TLS를 통한 암호화로 보안 강화

HTTPS 사용의 필요성:

  • 데이터 보안: 중요 정보 보호
  • 신뢰성 향상: 사용자에게 안전한 환경 제공
  • SEO 개선: 검색 엔진 최적화에 유리
  • 브라우저 호환성: 최신 웹 기술 사용 가능

프론트엔드가 HTTPS인 경우, 백엔드 서버도 HTTPS여야 안전한 통신이 가능합니다.

현재 크롬에서는 "onlyhttps"는 기본적으로 활성화되어 있기때문에
버셀로 구축한 프론트는 https가 자동으로 배포가 되어있어서 서버가 https가 아닌경우에는
통신이 이루어지지않습니다.
이를 무시하고 백엔드가 HTTP를 사용하면 "Mixed Content" 상황이 발생하며, 다음과 같은 심각한 보안 이슈가 생길 수 있습니다:

  • 중간자 공격 (Man-in-the-Middle Attack) 취약성:

HTTP 통신은 암호화되지 않아 데이터가 평문으로 전송됩니다.
공격자가 네트워크 트래픽을 가로채 민감한 정보를 훔칠 수 있습니다.

  • 데이터 무결성 손상:

HTTP 통신은 변조 감지 메커니즘이 없어, 전송 중 데이터 변경을 확인하기 어렵습니다.
공격자가 악의적인 코드나 잘못된 정보를 주입할 수 있습니다.

  • 세션 하이재킹:

암호화되지 않은 세션 쿠키나 토큰이 노출될 수 있습니다.
공격자가 이를 이용해 사용자의 세션을 탈취하고 권한을 얻을 수 있습니다.

이러한 이유로, 프론트엔드와 백엔드 모두 HTTPS를 사용하는 것이 매우 중요합니다. 전체 통신 과정을 암호화함으로써 데이터의 기밀성, 무결성, 그리고 사용자의 프라이버시를 보호할 수 있습니다.

네이버 클라우드 및 DNS 세팅

저는 네이버 클라우드를 사용해서 서버를 배포했고 각 dns와 acg, 네임서버에 대한 입력값을 세팅해줘야됩니다

네이버 클라우드 DNS(Global DNS) 설정

  • Host: @
  • Type: A 레코드
  • 레코드값: [서버의 공인 IP 주소]
    빈값과 www 둘다 입력해줘야됩니다

네이버 클라우드 ACG (Access Control Group) 인바운드 규칙 설정

  • TCP 443 포트 (HTTPS)
  • TCP 80 포트 (HTTP)
  • TCP 3001 포트 (애플리케이션 서버)
  • TCP 22 포트 (SSH)

사용하게될 포트 전부 acg에 입력해주면됩니다!

모든 포트에 대해 접근 소스가 0.0.0.0/0으로 설정되어 있어, 모든 IP에서의 접근을 허용하고 있습니다.

구매한 DNS 네임서버 설정

저같은 경우는 godaddy에 도메인을 구입했습니다
도메인 구매 사이트에서 다음 네임서버를 설정해야 합니다

로그인 후 -> dns -> 네임서버

  • ns1-1.ns-ncloud.com
  • ns1-2.ns-ncloud.com

이같이 네이버 클라우드와 DNS, 네임서버에 대한 세팅 끝났습니다.
이제 ssh서버에 진입해서 nginx와 certbot, 프록시를 설정해주면됩니다

nginx

nginx란 고성능 웹 서버이자 리버스 프록시 서버 세팅이 가능한 모듈입니다
certbot을 연결해 Let's Encrypt SSL/TLS 인증서를 발급할 수 있습니다.

3.1 nginx 설치 및 설정

sudo apt update
sudo apt install nginx

//nginx 설정진입 명령어
sudo nano /etc///nginx/sites-available/default

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    # 추가 설정...
}

//https는 443 포트이며 포트:3000을 프록시 설정하면
//도메인 입력시 도메인:3000으로 이동
server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:3000; # Node.js 서버 포트
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

주요 이슈

certbot 실행 시 80포트 바인딩 문제

원인: nginx가 80포트 사용 중
해결: sudo systemctl stop nginx 후 certbot 실행

ginx와 Node.js 서버 연동 문제

원인: 프록시 설정 오류
해결: nginx 설정 파일에서 proxy_pass 지시어 확인 및 수정

클라우드 ACG 설정 누락

문제: 외부에서 서버 접근 불가
해결: ACG에서 필요한 포트 개방 확인

결론
네이버 클라우드 환경에서 Let's Encrypt를 이용한 HTTPS 구현은 여러 단계와 주의사항이 필요합니다. nginx, certbot, 프록시 설정, ACG 관리 등 다양한 요소를 고려해야 하지만, 이를 통해 안전하고 신뢰할 수 있는 웹 서비스를 제공할 수 있습니다

profile
Frontend
post-custom-banner

0개의 댓글