삽질블로그

Nginx SSL인증을 통해 HTTPS 적용 본문

개발

Nginx SSL인증을 통해 HTTPS 적용

삽질블로그 2024. 4. 15. 23:21

 

이번에 알고리즘 리뷰 사이트를 개인프로젝트로 진행하면서 서버를 배포할 때 HTTPS를 적용하기로 했습니다.

저는 AWS EC2를 이용했기 때문에 

1. AWS의 로드밸런서를 통해 HTTPS를 적용하는 방법

2. Nginx로 HTTPS를 적용하는 방법

두 가지 방법 중 2번째 방법으로 진행하였습니다.

 

Nginx로 HTTPS를 구현한 이유는 아래와 같습니다.

 

1. AWS의 로드밸런서 비용이 부담된다.

2. 후에 Nginx로 무중단 배포를 구현해보려 계획중이다.

3. Nginx로 로드밸런싱 성능 테스트를 진행할 예정이다.

 

HTTPS란?

하이퍼 텍스트 전송 프로토콜 보안(HTTPS)은 웹 브라우저와 웹 사이트 간에 데이터를 전송하는 데 

사용되고 있는 기본 프로토콜인 HTTP의 암호화된 HTTP 프로토콜로서 안정화된 데이터 통신을 가능하게 합니다.

모든 웹 사이트는 HTTPS를 사용해야 합니다. 

 

HTTPS가 중요한 이유는?

이는 HTTP의 취약점에 있습니다. HTTP 프로토콜은 서버에서 브라우저로 전송되는 정보가 암호화되지 않습니다.

즉, 데이터가 쉽게 도난당할 수 있는 위험에 항상 노출되어있습니다.

이를 HTTPS가 SSL(보안 소켓 계층)을 사용함으로써 이 문제를 해결했습니다.

SSL은 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와주고,

서버와 브라우저 사이에 통신을 할 때 주고받는 정보를 도난당하는 것을 막아줍니다.

 

SSL이 뭔데? 

SSL은 데이터 통신을 보안하기 위해 사용되는 표준 보안 기술입니다.

SSL은 웹사이트와 브라우저끼리 통신할 때 오가는 데이터를 암호화하여 중간에 누군가 조작하거나, 엿보는 것을 방지합니다.

 

Nginx로 HTTPS적용해보기

그럼 이제 Nginx로 HTTPS를 적용해보겠습니다.

저는 Nginx의 서버 OS로 Ubuntu를 사용하였습니다.

 

1.  도메인 구입

HTTPS를 적용하기 위해서 우선 도메인을 구입해야 하기 때문에 저는 가비아에서 도메인을 구입하였습니다.

 

가비아 도메인 구입화면

원하는 도메인명을 입력 후 구매해줍니다.

 

2.  배포한 웹 서버의 ip와 도메인 연결

저는 AWS ec2를 이용해서 배포하였기 때문에 ec2의 ip를 연결해주겠습니다.

 

AWS ec2

생성한 ec2인스턴스의 퍼블릭 IPv4주소를 가비아에 연결해줘야합니다.

 

 

가비아 메인화면

 

 

가비아

 

 

가비아 도메인 관리

 

 

가비아 도메인 연결

 

 

 

 

가비아 도메인 연결

 

 

 

 

서버 ip 입렵

 

다음과 같이 aws ec2의 퍼블릭 ip의 주소를 입력해줍니다.

 

3.  인증서 발급(Let's Ecrypt)

 

Let's Ecrypt는 이메일, 도메인만으로 인증서를 무료로 발급할 수 있는 서비스입니다.

인증서는 Certbot을 통해서 발급받을 수 있습니다.

아래 명령어로 Certbot을 설치해줍니다.

sudo snap install certbot --classic

 

 

아래 명령어를 통해 인증서를 발급하면서 Nginx에 인증서 관련 설정을 자동으로 할 수 있습니다.

성공하게 되면 Successfullu received certificate 문구와 함께 인증서 정보를 출력해줍니다.

sudo certbot --nginx -d {도메인}

 

 

아래 경로에 가면 default라는 파일이 존재하는데, 해당 파일에서 Certbot이 Nginx의 사이트에 인증서 관련 설정을 보실 수 있습니다.

새로 파일을 만들고 싶으시면 default파일을 삭제하고 .conf파일로 새로 만들어주시면 됩니다.(후에 심볼릭링크 설정 해줘야함)

저는 default파일을 사용하였습니다.

파일 경로는 꼭 /etc/nginx/sites-available 이어야 합니다.

cd /etc/nginx/sites-available
vim default

 

4.  프록시 설정

default파일 다음과 같이 프록시 설정을 해줘야합니다.

server {
        listen 443 ssl; # 443 포트의 요청을 받으면
        server_name reviewserver.store; # 도메인 지정

        location / {
                proxy_pass http://{aws ec2의 ip주소};
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $http_host;
                }
        ssl_certificate  /etc/letsencrypt/live/reviewserver.store/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/reviewserver.store/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
        listen 80; # 80 포트로 요청을 받으면
        server_name reviewserver.store;
        return 404; # http로 요청하면 404
}

 

 

각 역할

1. 443이 있는 server{} 

reviewserver.store에 443(https)요청이 오면 aws의 ip주소로 요청을 프록시해줍니다.

Note) 후에 aws Nginx의 보안설정 -> 인바운드 규칙에서 443포트를 열어줘야  요청을 받을 수 있습니다.

 

2. 80이 있는 server{}

80포트로 요청을 받으면 404응답을 줍니다.

 

3. proxy_pass 

Nginx에서 받은 요청을 제 서버로 위임해줍니다.

따라서 제 서버(node)의 ip주소를 지정해줘서 https로 들어온 요청을 프록시해줍니다.

 

SSL 관련 설정

  • ssl_certificate
    default 파일에서 ssl_certificate 에는 certbot이 발급해준 fullchain.pem의 경로를 적어주면 됩니다.
    경로를 모른다면 /etc/letsencrypt/live/{구매한 도메인}/fullchain.pem을 적어주시면 됩니다.
  • ssl_certificate_key
    ssl_certificate_key 에는 certbot이 발급해준 privkey.pem의 경로를 적어주면 됩니다.
    경로를 모른다면 /etc/letsencrypt/live/{구매한 도메인}/privkey.pem을 적어주시면 됩니다.
  • options-ssl-nginx.conf와 ssl_dhparam
    options-ssl-nginx.conf을 include 하는 것과 ssl_dhparam을 지정해주는 것은 certbot이 자동으로 해줬던 것들입니다.
    options-ssl-nginx.conf에는 ssl의 session_cache, session_timeout, ssl_protocols 등의 설정이 있습니다.

 

문법 테스트

Nginx의 default파일을 변경하셨다면 Nginx의 문법에 틀린 것이 있는지 체크해야합니다.

아래 명령어로 문법체크를 해줍니다.

sudo nginx -t

 

문법 체크를 했다면 Nginx를 재실행 해줍시다.

sudo service nginx restart

 

Nginx가 실행중인지 확인하려면 다음 명령어를 입력합니다.

sudo service nginx status

 

위 명령어 입력시 Active : active(running)이면 실행중인 것 입니다.

 

header 설정

default에서 proxy_set_header를 위와 같이 설정해주면, 제 서버로 들어오는 요청에 대한 로깅은 아래와 같습니다.

###### HTTP Request ######
GET /boards/contents HTTP/1.0
x-forwarded-for: {IP주소} # $proxy_add_x_forwarded_for 로 설정
x-forwarded-proto: https # $scheme 로 설정
x-real-ip: 218.39.176.142 # $remote_addr로 설정
host: was.sokdaksokdak.com # $http_host 로 설정
connection: close

 

이렇게 Nginx로 https를 구축해놓고 가비아에 구매한 도메인으로 api요청을 하면

aws ec2 서버로 받을 수 있습니다.

 

 

 

참고자료 : 

 

https://www.cloudflare.com/ko-kr/learning/ssl/what-is-https/

https://velog.io/@byeongju/HTTPS-%EC%A0%81%EC%9A%A9%EA%B8%B0

'개발' 카테고리의 다른 글

NestJS 예외 핸들링  (1) 2024.07.22
개인 프로젝트 후기  (3) 2024.07.19
Docker와 Jenkins를 이용해서 CI/CD를 구축해보자  (1) 2024.04.16
알고리즘 리뷰 사이트 만들기(1)  (0) 2024.03.11
간단한 프로젝트 만들기  (0) 2024.03.02
Comments