1차 프로젝트는 github에서 제공하는 io로 리액트로 만든 클라이언트 부분만 보여질 수 있었고,
서버단에서 처리하는 건 하나도 안됐다. 그래도 그땐 외부에서 프론트라도 보여지는거에 신기했는데
2차,3차의 web-inf > views는 보안 목적때문에 github.io로 사용하지도 못해서 어떻게 해야 하나 고민중이였다.
포폴에 프로젝트 했던거 배포해 보려고 이것저것 알아보다가
갑자기 2차 발표때 톰캣으로 서버 킨 상태에서 ip주소로 다른 컴퓨터에서 들어간 기억이랑,
aws로 프로젝트 배포하는 법 잠깐(3시간..) 배운 기억이 나서 이것저것 찾아봤다.
검색해본 결과
톰캣으로 서버 돌리고
사설 IP를 공인 IP로 바꾸고 공인IP:9090하면 외부에서도 접속이 된다고 한다!
거기다가 공인 IP:443으로 HTTPS 설정까지 도전!
설정 과정
1. 공인IP 확인
일단 내 공인 IP를 알기 위해서 cmd에 명령어로 확인!
nslookup myip.opendns.com. resolver1.opendns.com
121로 시작하는 아이피가 내 공인 아이피!
2. 도메인 구입
121.x.x.x:80/BBOL로 배포할 수는 없으니까 공인 아이피에 옷을 입혀줘야 한다.
도메인 사서 입혀주기! 도메인은 후이즈에서 구매했다.
3. 공인IP에 구입한 도메인으로 연결 (A레코드 연결)
도메인에 A 레코드 추가는 도메인 네임 시스템(DNS) 설정에서 특정 도메인 이름을 IP 주소와 연결하는 작업을 의미한다고 한다.
이제 구입한 도메인에 공인 IP를 연결해주면 된다. 주소창에 도메인을 넣어주면 > 공인IP로 연결!
4. 외부에서 접근 가능하도록 80, 443 방화벽 포트 포워딩
웹 브라우저는 기본적으로 HTTP 프로토콜을 사용할 때 80번 포트를 사용한다. 사용자가 http://도메인 을 입력하면 자동으로 80번 포트로 요청을 한다.HTTPS 프로토콜은 443번 포트를 쓴다.
80과 443을 방화벽에서 인바운드 규칙에서 열어줬다.
5. 기존 http로 접근하던 방식을 SSL인증서를 통해 https로 변경
HTTP , HTTPS
기존에 연결하던 공인IP > 도메인 방식은 HTTP 방식이여서 보안에 취약했다. 그래서 https로 바꿔보려고 했다.
(매번 사이트 들어갈때마다 위험! 이 뜨고있었다.)
그 전에 http랑 https랑 무슨 차이일까 궁금해서 알아보았다.
HTTP
내가 이해한 HTTP는 데이터를 전송할 때 암호화 되지 않은 평문 상태로 전송한다는 것이였다.
예를 들어 와이파이를 사용해서 웹 페이지를 들어갔는데
그 페이지가 HTTP면 거기서 로그인을 할 때 암호화되지 않은 평문 텍스트들이 전송이 된다.
ID : USER / PW : 1234
그럼 누군가 같은 와이파이를 접속해서 평문의 텍스트들을 다 가로챌 수 있다!! 는 것이였다.
그럼 HTTPS를 사용하면?
HTTPS는 HTTP + SSL/TLS로 이루어져있는데
ID : 암호화 / PW : 암호화
이렇게 암호화가 되어져서 전송이 되니까 도중에 가로채더라도 암호화된 값들이라 알아볼 수가 없다.
그럼 이 HTTPS를 사용하려면 SSL 인증서가 필요한데
SSL인증서는 뭐지? 하고 찾아봤다.
SSL 인증서는 웹 사이트와 사용자가 주고받는 데이터들을 암호화하고, 웹 사이트의 신원을 검증해주는 디지털 인증서라고 한다.
이 SSL 인증서에는 공개키(Public Key), 비밀키(Private Key)가 있으며 이 키를 사용해 서버 간 주고받는 데이터들을 암호화 한다고 한다.
사용자가 ID : USER / PW : 1234 라고 전송하면 'sd$jlosdf2@slk1)($()@' 식으로 전송이 된다!
사이트에 자물쇠🔒 가 보인다면 그건 암호화된 HTTPS 사이트라는 것!
이 SSL 인증서는 신뢰할 수 있는 인증 기관에서 발급하는데
DigiCert, GlobalSign, Sectigo, Let's Encrypt 이런 곳들이 있다고 한다.
그래서 SSL 인증서 발급받기 도전!
여러곳을 찾아봤는데 ZeroSSL에서 무료로 다운받았다.
먼저 HTTPS에 내 도메인을 넣어주고 Next Stop 클릭!
회원가입 후 다시 조회!
90일 인증서 선택!
추가 기능은 패스! CRS는 자동 생성! 마지막으로 무료버전으로 생성!
이메일 인증하고! next step 눌러서 인증키들을 다운받았다.
서버는 tomcat에서 돌리니까 tomcat용 인증키로 받았다.
톰캣에서 SSL 인증서를 사용하려면 이 세 파일들을 PKCS12 형식의 keystore.p12로 변환하고,
변환된 keystore를 또 jks 형식으로 변환해야 한다.
PCKS12? JKS? 왜 이걸로 변환해야하지?
tomcat과 같은 java 기반의 서버에서 SSL 인증서를 적용하려면 Java Key Store인 JKS 형식이 필요한데
내가 받은 파일들을 일단 PKCS12 형식으로 변환하고, 톰캣을 쓰기 때문에 그걸 다시 JKS로 변환해야 한다.
일단 PKCS12형식으로 변환할때는 OpenSSL을 사용해서 변환했다.
openssl pkcs12 -export -in certificate.crt -inkey private.key -out keystore.p12 -certfile ca_bundle.crt
그 후 나온 파일을 keytool을 이용해 JKS로 변환했다.
keytool -importkeystore -deststorepass [keystorepassword] -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass [p12password] -alias server_cert
만들어진 keystore.jks
이제 이걸 톰캣의 server로 들어가서 설정해줘야한다. 전 tomcat 9.0 버전을 쓰고 있습니다!
Connector 부분에다가 설정해주기!
<Connector connectionTimeout="20000" maxParameterCount="1000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<!-- SSL Configuration for HTTPS on port 8443 -->
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
keystoreFile="키스토어 경로"
keystorePass="키스토어 비밀번호"
keyAlias="보통은 server_cert"
clientAuth="false"
sslProtocol="TLS">
</Connector>
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="private.key 경로" certificateFile="certificate.crt 경로" certificateChainFile="ca_bundle.crt 경로" type="RSA" />
</SSLHostConfig>
</Connector>
이렇게 설정했다. 80포트(HTTP)로 들어오면 443(HTTPS)으로 반환하게 설정하고,
파일 경로랑 Alias 설정해주고 하단의 Connector에서도 private.key, certificate.crt, ca_bundle.crt의 경로도 설정해줬다.
그러고 두근두근 테스트!
7. 테스트
HTTPS에서 잘 들어가진다! 야호!!