https를 적용하기전 간단하게 SSL에 대해서 알아보자
SSL은 웹서버와 클라이언트의 통신 암호화 프로토콜이다.
SSL이 적용되지 않은 통신의 경우, 평문이 그대로 전송된다. 만약 제 3자가 어떠한 방식으로든 통신 패킷을 탈취할 경우, 그 내용을 쉽게 확인할 수 있다. → 사용자 개인 정보나, 결제 정보와 같은 민감한 정보의 통신이라면 얘기가 달라진다.
SSL을 적용한다면 이러한 문제를 기술적으로 해결할 수 있다. 요청을 암호화해서 보내므로 통신 패킷이 탈취되더라도 복호화 키가 없으면 원래 내용을 알 수 없기 때문이다.
그렇다면 어떻게 적용해야 할까?
일단 시작하기 앞서서 준비해야할게 두가지가 있다. 하나는 도메인이고 다른 하나는 도메인과 Web Server의 연결이다.
요즘 도메인을 제공해주는 서비스(가비아, aws, 고대디 등등)가 많기때문에 이 부분에 대한 설정은 생략하고 nginx에서 설정하는 부분만 설명하고자 한다.
$ sudo apt-get update #운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보(리스트) 업데이트
$ sudo apt install nginx -y #nginx 설치하기
$ nginx -v #설치한 nginx 버전 확인
$ sudo service nginx status #nginx running 상태 확인
snapd: 쉽게 말해 리눅스 통합 패키지 관리 툴
certbot 설치 페이지에서는 snapd로 설치하는 것을 권장했다.
sudo apt-get install snapd -y #snapd 를 설치하자
sudo systemctl enable --now snapd.socket #systemd 에 등록하자.
sudo systemctl list-unit-files | grep snapd.socket #잘 되었는지 확인
sudo ln -s /var/lib/snapd/snap /snap #공식 페이지에는 classic snap support 를 위해서 아래와 같이 링크를 만들라고 하고 있다
sudo systemctl start snapd #snapd 데몬 실행
https 페이지를 만들기 위해서는 ssl인증서를 발급받아 적용해야한다.
https를 확산시키기 위한 움직임으로 Let's encrypt의 형태로 ssl인증서를 무료로 제공하는 라이브러리가 생겼는데 그게 바로 Certbot이다.
sudo snap install core;
snap version # 버전 확인
sudo snap install --classic certbot # certbot 설치
sudo ln -s /snap/bin/certbot /usr/bin/certbot # certbot 명령어를 사용하기 위해 심볼릭링크를 걸기
certbot --version #버전 확인
sudo certbot certonly --nginx -d {도메인주소}
위와 같은 명령어를 입력했으면 이메일 입력하는 창이 나오고 몇번의 Y/N을 입력하고 나면 Successfullu received certificate.
가 나오면서 인증서 정보를 출력해 준다.
일단 nginx의 설정파일을 수정하기 전에 각각의 디렉토리와 역할에 대해 짧게 확인해보면
/etc/nginx/sites-available 아래 {{이름}}.conf파일을 생성 (이름은 자기 마음대로)
sudo vi test.conf
server {
listen 80; #80포트로 받을 때
server_name api.naepyeon.site; #도메인주소, 없을경우 localhost
return 301 https://api.naepyeon.site$request_uri;
}
server {
listen 443 ssl http2;
server_name api.naepyeon.site;
# ssl 인증서 적용하기
ssl_certificate /etc/letsencrypt/live/{도메인주소}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{도메인주소}/privkey.pem;
location / { # location 이후 특정 url을 처리하는 방법을 정의(여기서는 / -> 즉, 모든 request)
proxy_pass http://{server ip}:8080; # Request에 대해 어디로 리다이렉트하는지 작성. 8080 -> 자신의 springboot app이사용하는 포트
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
if ($host = {도메인주소}) {
return 301 https://$host$request_uri;
}
listen 80;
server_name {도메인주소}
return 404;
}
sudo nginx -t #{도메인주소}.conf의 문법을 확인
sudo ln -s /etc/nginx/sites-available/{도메인주소}.conf /etc/nginx/sites-enabled
#sites-enabled에 심볼릭 링크를 생성
sudo ls -l /etc/nginx/sites-enabled
# nginx 재시작
$ sudo service nginx reload
또는
$ sudo service nginx restart
여기까지 문제없이 따라왔다면 설정이 모두 완료되었다는 의미이다.
설정했던 도메인으로 접속해보면 도메인 주소 옆에 자물쇠모양이 생긴걸 확인할 수 있다.
테스트코드 성능 개선하기! (0) | 2023.03.20 |
---|---|
[Spring + SSE + Redis] SSE를 사용한 실시간 알림 Scale out 시 문제점 해결하기 (0) | 2023.02.02 |