맨날 서버 개발만 하면서 배포하는데 내부적으로 사용되는 서버만 사용하다보니 https 신경안쓰다가 드디어 https를 신경써야 될 때가 왔다.
먼저 ssl을 발급받아야 하는데 구글링을 해보면 개발자 자체 인증(self-signed)로 설명해놓은 것이나 openssl을 통한 ssl 발급들에 대한 내용들만 많아서 어려운 부분이 있었다.
이 글에서는 기업용(ov) ssl발급과 관련된 내가 경험한 모든 과정에 대해 설명하고 발급받은 ssl을 react, nextjs, nginx를 사용하여 https를 적용한 사례를 소개한다.
ssl발급을 이미 받은 사람이라면 아래 nginx + nextjs + react 섹션으로 가기 바람
ssl을 발급받기 위해선 ssl발급 업체에서 직접 발급받는 방식과 국내 총판 업체를 통하는 방식이 있는데 당연히 ssl발급 업체에서 직접 발급 받는 것이 20~30% 저렴하다. 총판 업체를 거친다면 가격이 비싼만큼 서비스의 질이 향상 된다는게 장점
결론 : 고대디에서 ssl 발급 시 csr 신청할 때 한국을 지원하지 않기 때문에 비추천함.
, 도메인을 고대디에서 사용하고 있기에 고대디에서 ssl을 발급하고자 하였다. 구글에 고대디 ssl을 검색하면 바로 링크가 노출된다.
https://kr.godaddy.com/web-security/ssl-certificate
여기서 구매 가능하나 고대디에서 발급받은 ssl은 csr발급시 한국 국가를 지원하지 않는다. csr발급 받을 시 이미 csr이 존재하는 경우에 취할 수 있는 액션도 제공하는데 기존에 csr을 가지고 있지 않아서 고대디에서 제공하는 csr발급기를 사용하려는데 한국이 목록에 없어서 당황했다.(csr을 만들고 시도해볼걸 그랬다..) 그래서 취소하려고 고객센터에 전화했더니 한국 센터는 이제 없어져서 영어로 대화 해야 했다. 식은땀을 흘려가며 취소를 완료 했고 5~7일 뒤에 환불을 확인했다.
결론 : 영어가 가능하다면 ssl 발급 업체에 직접 컨택하고, 서비스가 원활하고 한국어 서비스를 받고 싶다면 한국 총판업체를 선택
한국전자인증, 가비아, 유서트, 코리아 ssl등 10개 가량의 업체를 검색하고 비교 견적을 냈던 것 같다. 광고 아니고 그 중에 코리아 ssl의 대응방식 및 가격이 가장 합리적이다 생각해서 선택하게 되었다. 사이트의 디자인이 쫌.. 뭐랄까.. 유령업체같은 느낌이 좀 들긴 했지만 ㅋㅋ오톡 대응이 너무 마음에 들어 계약하게 되었다.
코리아 ssl을 접속하면 우측 하단에 견적요청, 채팅상담이 있는데 채팅상담으로 궁금한 것들을 물어보고 견적을 받은 뒤 맘에 드는 ssl을 신청하면된다.
단, 여기서 본인이 사고싶은 ssl업체 및 ssl종류(DV, OV, EV)는 선정해 놓는 것이 좋다.
ssl을 살때 고려할 점은 내 경험상 추려보면 아래와 같다.코리아 ssl사이트에 접속하면 우측하단에 견적요청 및 채팅상담이 뜨는데 필자는 채팅상담으로 진행했다.
ssl 발급과정에 대해 모두 담고 싶지만 이미 지나온 과정에 스샷을 놓쳐서 아쉽게도 자료를 더 남길 수가 없다.. 상담하면 진짜 a to z가 아니라 0 to Z까지 알려준다. 코리아ssl 짱.. 아래부터는 nginx + nextjs + react 배포시 https를 적용한 내용을 기록한다.
sudo apt-get update
- 업데이트 안하면 종속성 에러가 발생할 수 있다.
sudo apt-get install nginx
여기서 가끔 에러가 발생하는데 apache2가 미리 설치되어 있거나 80포트가 사용중이면 '이미 사용중인 포트' 에러가 발생하니 ps -ef | grep 80
을 통해 80포트로 수행중인 프로세스를 킬(kill {processid})을 하고 재수행한다.
혹시나 아래와 같은 에러가 발생한다면, ipv6과 관련된 에러이다.
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
ipv6을 비활성화 하는 서버의 경우 위와 같이 에러가 발생함으로 80 리스닝 부분을 주석해야 한다.
$ cd /etc/nginx/sites-enabled
$ vim default
server {
listen 80 default_server;
#listen [::]:80 default_server;
위와같이 주석을 해주자.
기본적으로 웹서버를 배포할 때는 nginx에 배포할 정적페이지의 경로를 지정하고
service nginx restart
명령어만 때려주면 그만인데 nextjs가 서버사이드 렌더링을 지원하는 프레임웤이다보니 index.html 같은게 없더라(난 개발 말고 배포만 해주었다 프론트 잘모릅니다. 근데 방법이 있는것 같긴 하니 찾아보면 본인의 지식에 도움이 될듯합니다). 그래서 좀 찾아보니 nginx의 리버스 프록시를 이용하면 될 것 같았다. 리버스 프록시란 간단하게 서버에 특정 포트로 들어온 요청을 다른 포트로 보내준다고 생각하면 된다.
1. 우선 nextjs + react 앱을 4000번 포트로 띄우고 잘 동작하는 것을 확인.
2. nginx의 동작을 확인하기 위해 80포트로 접속해보니 nginx 기본 페이지 동작 확인.
이후 nginx의 리버스 프록시를 적용시키기 위해 nginx의 config파일을 수정하러 떠났다.
cd /etc/nginx/sites-available
vim default
server {
listen 80 default_server;
location / {
proxy_pass http://127.0.0.1:4000;
}
}
위와 같이 프록시 설정을 하고 service nginx restart
를 하면 80포트로 접근하는 요청을 해당서버 4000번으로 돌려준다.
https 동작을 하기 위해서는 ssl인증서를 nginx 또는 nextjs에 직접 설정을 해줘야 하는데, 나는 nginx의 리버스 프록시를 사용했으므로 nginx에 ssl을 등록하는 방법을 설명한다.
다른 총판은 어떤지 모르겠는데, 코리아 ssl에서는 본인이 운용하는 서버의 타입에 따라 다운받아야 할 파일을 추려준다.
나는 nginx로 운용하니 선택하면 아래처럼 나온다 그냥 두개 다운받으면 끝이다. 예전 sectigo 인증서를 가비아 통해서 했더니 루트인증서, 체인인증서 등등 다 열어서 합쳐줘서 crt파일로 만들어야 했는데 아주 편함.
아무튼 두 파일을 다운받아서 /etc/nginx/ssl
폴더를 만들고 그 안에 넣어줬다.
이후 아래 명령어를 통해 nginx config 파일을 수정하고
vim /etc/nginx/sites-available/default
//기존 서버 블록 - 특정 다른 글들 보면.. 이 서버 블록을 수정하는 것처럼 되어있는데,
//80 포트로 들어오는 연결을 443포트(https)로 redirect 해주기 위해서라도 남겨두어야 한다.
//redirect를 해주지 않으면 www.xxx.com 그냥 이렇게 브라우저에 쳤을때 (주의요함)이 페이지 url창에 뜬다.
//또한 https로 접속하려면 굳이 https://www.xxx.com 요렇게 쳐줘야 https로 접속한다.
server {
listen 80 default_server;
location / {
proxy_pass http://127.0.0.1:4000; // <- (1)요부분을 아래쪽 서버 블록(2)으로 옮기고 삭제해야함
}
}
//신규 서버 블록을 추가한다.
server {
listen 443 ssl;
server_name www.xxx.com; //본인 도메인 주소
ssl on;
ssl_certificate /etc/nginx/ssl/wildcard_test.pem; //crt 확장자도 상관없음
ssl_certificate_key /etc/nginx/ssl/wildcard_test.key; //ssl 인증서 다운받을 때 제공해주는 키값
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:4000; // <- (2)요기로
}
}
service nginx restart
하고 www.xxx.com으로 접속하면 자물쇠 모양이 뜨는 것을 확인 할 수 있다.
길지만 읽어주셔서 감사합니다.