반응형

트러블

프로젝트를 서버에올리고 진행하면서 문제가 생겼다. 

 

get 요청으로 데이터는 잘받아와지는데 post요청으로 동작하는 로그인이 동작하지않았다 . 

 

우선 내 프로젝트환경은

클라이언트부분은 next 로 만들어서 vercel 에 호스팅해주었고

api 부분은 aws 의 ec2에 호스팅해 두었다.

그래서 처음엔 cors에러인가 했는데 서버부분에 cors 처리를 이미 다 해두어서 cors 에러는 아니였다. 

 

원인

그래서 찾아보니

vercel로 호스팅한 페이지는 https로 되어있고 서버는 http로 호스팅이되어서 이런 에러가 발생한다는걸 발견했다. 

Mixed Content: The page at 'https://...' was loaded over HTTPS...

 

이걸 해결하기위해서 프론트에서 메타데이터에

어떤 태그를 추가해주면 해결된다고해서 추가해줘봤지만 실패했다. 

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"></meta>

 

 

결국 서버인 스프링을 https로 배포해야된다고 해서

스프링을 https로 띄우기위해서 상당히 많은 시도를 해봤다. 

그러나 가장간단한방법으로 해결했다. 

 

해결

우선은 서버에 올려야하기때문에 도메인을 구매해주었다. (도메인은 가비아에서 구매할수있다.)

 

웹을 넘어 클라우드로. 가비아

그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브

www.gabia.com

 

구매한 도메인은 aws에서 사용하기위해 route53 에서 등록해주었다.

 

호스팅영역을 생성하고 레코드 생성을 눌러서 레코드를 만들어준다.

 

레코드이름부분과 값부분에 도메인을 사용할 ec2인스턴스의 public ip를 넣어주면

해당 도메인주소로 접근할때 ec2로 연결시켜준다.

 

네임서버 설정

레코드유형에 ns라고되어있는 레코드가있고 값에 네임서버 주소들이있다. 

이 주소를 도메인을 구매한곳에서 네임서버 등록을 해줘야한다. 

 

만약 나처럼 가비아에서 구매했다면 가비아에 들어가서 구매한도메인을 클릭하고들어가면

네임서버옆에 설정버튼이 있을텐데 이걸 클릭하고 들어가서 .

1 2 3 4차에 route53에 있는 네임서버 주소값을 넣어주면된다 

* 입력할때 route53에는 마침표가들어있으니 마침표는 다 빼주어야한다. 

 

이렇게 네임서버 등록까지 완료하면 이제 인증서를 받을 준비가 끝났다. 

 

SSL 발급

 

나는 certbot 을 이용해서 ssl 인증서를 발급받는 방법을 사용했다.

 

ec-2 terminal

sudo yum install certbot
sudo certbot certonly --standalone -d 구매한도메인.com

 

이렇게 명령어를 실행하면 /etc/letsencrypt/live 경로에 입력한도메인폴더가 생기고

해당폴더안에 

fullchain.pem 

privkey.pem 가 발급되어있다. 

이제 이파일들을 스프링이 읽을수있는 파일인 PKCS12 형식으로 변경해주어야한다. 

sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem 
-out keystore.p12 -name ttp -CAfile chain.pem -caname root

 

이 명령어를 입력하면 keystore.p12 라는 파일이 생긴다. 

이 명령어를 입력하면 해당 키의 비밀번호를 입력하게되는데 이 파일을 사용하기 위해서 꼭 필요하니

어딘가에 메모해두자. 

 

HTTPS로 run 시키기 

실행시킬 스프링 프로젝트의 resouces에 ssl 폴더를 만들어주고 이 안에 keystore.p12 파일을 넣어준다.

 

properties 세팅 .

# application-aws.yml
server:
  port: 443  # aws 환경에서 사용할 포트
  ssl:
    key-store: classpath:ssl/keystore.p12
    key-store-type: PKCS12
    key-store-password: ${P12_KEY}
    enabled: true

 

나는 yml이 편해서 yml로 만들어주었다 .  
이렇게 세팅을 마치고 빌드한후에 실행시켜주면 

도메인으로 접근하고 api 요청에대한응답도 잘 받아오는걸 확인할수있다. 

 

https 가 중요하다고하지만 포트폴리오 단계에서적용해볼 생각은 한번도 해본적없었는데 우연히 https에서 http로 요청하면 에러가 발생한다는걸 알게되고 멀리 돌아왔지만 스프링을 https로 호스팅하는 방법도 알게되어서 굉장히 기쁘다. 

 

이번에 찾아보면서 nginx에 대해서도 많이 보고 aws에서도 로드밸런서나 route53에 대한부분을 많이 봤는데 nginx 는 추후에 따로 더 찾아보면서 프로젝트에 적용해보고싶어졌다. 

스프링에서는 자체적으로 tomcat을 가지고있어서 nginx같은 웹서버가 없이도 웹을 동작시킬수있지만 나중에 서버하나로는 부하가 심한경우에 nginx를 제일앞단에 사용하고 서버를 여러개 붙여서 로드밸런싱이란걸 해줄수있다는점이 상당히 흥미로웠다. 물론 지금단계에서는 웹에올려놔도 나밖에 안보지만 ... 부하가 발생한 후에 적용하면 늦는다는 생각으로 포폴이 어느정도 완성되면 공부해서 적용하고싶다.

 

 

SpringBoot에 SSL 인증서를 적용해보자 (feat. AWS EC2)

SSL, HTTPS, SpringBoot

velog.io

이 글을 보고 에러를 해결한후에 작성하는 트러블 슈팅이다. 혹시 부족하거나 잘 모르겠는부분이있다면 이 글도 참고하면 좋을것같다.

반응형

+ Recent posts