티스토리 뷰

정적 웹을 HTTPS로 배포하기에 이어 이번에는 EC2 인스턴스로 배포한 톰캣에 HTTPS로 접근하고자 합니다.

 

[AWS] HTTP to HTTPS로 배포하기 (S3 기준)

이전 글 'Route 53 도메인 구매 후 연결하기'에서 도메인 구매 후 S3와 연동시켰습니다. 하지만 Http로 접속되기 때문에 이를 Https로 바꿔보는 작업을 하겠습니다. Https로 바꾸기 위해서는 S3, CloudFront,

kingofbackend.tistory.com

정적 웹 같은 경우에는 Application Load Balacner(ALB)가 필요없어서 그리 어렵지 않았지만, 동적 웹(EC2) 같은 경우는 ALB를 필요로 합니다. 따라서 AWS와 네트워크에 대한 기초지식이 필요합니다.

 

ALB는 간단히 말해서 L7 Load Balancer로 프로토콜 헤더로 서버 분산을 가능케 해주는 AWS의 Load Balancer입니다. HTTP, HTTPS 뿐만 아니라 L7에 속하는 DNS, SMFP 등도 가능합니다.

 

ALB에 대해선 여기까지 설명하고 이제 EC2로 배포한 톰캣에 HTTPS로 접근하는 방법을 알아보겠습니다. 우선 선행되어야 하는 환경은 아래와 같습니다.

 

  • Route53에서 구매한 도메인
  • ALB
  • EC2로 배포한 톰캣 또는 Node.js

그럼 시작하겠습니다.

 

참고 : SSL/TLS도 도메인과 마찬가지로 연 단위로 구매해야 하지만 AWS ALB를 이용하면 무료입니다


AWS Certificate Manager(ACM)

 

ACM은 AWS 내 인증서 관리를 해주는 서비스입니다.

 

"인증서 요청" 버튼을 눌러줍니다.

 

"공인 인증서 요청"을 선택하고 "인증서 요청"을 누릅니다.

Route53에서 구매한 [도메인 이름]을 작성합니다. 저는 headit.me 에 대해 이미 인증서가 있어서 *.test.headit.me로 했습니다.

 

[DNS 검증]은 CNAME을 통해 이 도메인이 유효한 지 체크 하는 영역입니다. 누군가 임의로 제 도메인에 대한 인증서를 만들면 안되잖아요?

 

그리고 [요청]을 눌러줍니다

요청은 누르면 아래와 같은 이미지가 나옵니다. 그럼 여기서 이제 headit.me라는 도메인에 대한 소유권이 있는 지 체크해줘야 합니다.

 

Route53으로 구매한 도메인이라면 아주 쉽게 인증할 수 있습니다. 해당 [인증서 ID]를 눌러줍니다.

여기서 오른쪽 상단에 [Route 53에서 레코드 생성]을 눌러줍니다.

Route 53에서 도메인을 구매했기 때문에 자동으로 설정이 완료됩니다. [레코드 생성]을 눌러줍니다.

생성 후 몇분 지나면 아래와 같이 성공인 상태가 됩니다.

 

이로써 HTTPS에 필요한 SSL 인증서를 AWS에서 발급받았습니다. 원래 SSL를 구매할 수 있는 사이트들이 존재하고 거기서 금액을 지불하고 사야하는데 AWS같은 경우는 무료로 제공해줍니다.

 

여담으로 SSL/TLS를 외부에서 구매하면 연동할 수 있도록 key, csr, crt 등을 주는데 AWS ACM 같은 경우 이를 획득하는 것이 불가능한 걸로 알고 있습니다. 그래서 AWS 서비스가 아닌 외부 서비스는 Https 사용이 불가능합니다. EKS 같은 경우 AWS Load Balancer를 통해 Ingress Controller를 설정해주면 ARN으로 받게 되어있습니다.

 

이런식으로 어노테이션을 통해 인증서의 ARN을 설정해주어야 합니다. 

alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxxx:certificate/xxxxxxx

결국 AWS ACM는 무료지만 반강제로 AWS 서비스만 사용하도록 하는 것이 아마존의 의도가 아닌가 싶습니다.


Application Load Balancer

 

이제 ALB를 생성해보겠습니다.

 

"Load Balancer 생성"을 눌러줍니다.

 

 

ALB를 선택해줍니다.

 

ALB 이름을 작성해줍니다.

잠깐 Schema의 Internet-facing과 Internal을 설명 드리겠습니다.

Internet-facing(mode Instance)은 NodePort에 접근하여 여기서 서비스를 통해 통신한다는 것이고,

Internal(mode IP)은 직접 파드의 IP에 통신한다는 설정입니다.

 

우리는 EC-2 라는 노드에 접근하기 때문에 Internet-facing을 선택해줍니다. Internal은 쿠버네티스를 이용해서 노드 보다 더 작은 단위와 통신하기 위하여 사용합니다. 

 

계속 이어서 원하는 VPC와 가용영역을 선택해줍니다.

 

보안그룹과 리스너를 선택해줍니다. HTTPS는 443포트를 사용하니 443 리스너를 추가해줘야 합니다. 그리고 target group에 EC2를 추가해준 후 선택해줍니다. 만약 아무것도 안뜬다면 타겟그룹을 생성해주시면 됩니다.

 

"Create load balancer"를 눌러줍니다.

 

ALB가 정상적으로 생성되었습니다.

 

이후 리스너 탭에서 HTTPS:443의 "인증서 보기/편집"을 눌러줍니다.

아까 발급받은 인증서를 클릭 한 후 상단에 [추가]를 눌러줍니다.

그럼 이제 가장 중요하다고 볼 수 있는 [규칙]을 설정해보겠습니다.

HTTP:80 의 규칙을 클릭합니다. 아래와 같이 설정합니다. 왜 이렇게 하는지에 대해선 Network L7에 대한 지식이 필요하므로 여기선 설명하지 않겠습니다. HTTP로 접근했을 경우 HTTPS로 리다이렉션 될 수 있게 합니다.

그리고 다시 들어와 이번에 HTTPS:443의 규칙을 클릭합니다. HTTPS에서 실질적으로 타겟그룹으로 요청을 전달해야 하니 위와 같이 설정해줍니다.

 

여기서 타겟그룹이 Node.js나 톰캣이 있는 노드들의 그룹입니다. 물론 포트도 맞쳐주어야 합니다. 또한 전달 대상에 가중치를 두어 어느 곳으로 더 많이 요청이 전달되게 할 수도 있습니다.

이로써 로드 밸런서의 설정 부분도 끝입니다.


DNS 설정

 

Route53에 접속 후 "레코드 생성"을 눌러줍니다.

레코드 이름, 레코드 유형, 트래픽 라우팅 대상을 설정해줍니다. 트래픽 라우팅 대상 같은 경우 별칭을 누르면 아까 생성해놓은 ALB를 쉽게 등록할 수 있습니다. 

좀더 설명을 덧붙이겠습니다.

 

레코드 유형의 경우 크게 A, NS, CNAME이 있습니다.

 

A: address의 약자로 도메인이 IP주소를 바로 바라봅니다.

NS: name server의 약자로 도메인이 등록되어 있는 name server를 말합니다.

CNAME : Canonical Name의 약자로 도메인에서 도메인을 바라 보게 합니다.

 

따라서 위 설정은 *.test.headmit.me로 접속시 ALB의 ip로 접속하겠다라는 뜻입니다.

 

이로써 모든 준비과정이 끝났습니다. 결과를 확인하기전에 몇까지 알아야할 사항이 있습니다.


반드시 알아야할 점

포트가 443이라고 해서 서버에서 톰캣 설정을 443으로 할 필요가 없습니다. 톰캣에서는 그저 웹서버의 포트인 80만 열어주면 됩니다. 왜냐구요? HTTPS를 사용하는 이유를 생각해보면 쉽게 알 수 있습니다.

 

Browser(Client) < - HTTPS(TLS) - >  ELB(ALB) < - HTTP - > WAS

 

보통 TLS를 수행한 뒷단은 암호화하지 않고 전달이 가능하기 때문입니다. 즉 ALB에 접근할때만 TLS 인증을 하면 됩니다.   따라서 따로 톰캣에 443 포트를 열어둘 필요가 없습니다. ALB를 활용함으로써 모든 서버에 이제 TLS를 적용할 필요가 없게 되었습니다.

 

 

마무리

crt

자물쇠와 TLS Handshake 과정이 있는걸 보니 더 이상 의심의 여지가 없습니다.

 

이로써 EC2 인스턴스에 HTTPS를 입히는 과정을 알아보았습니다.

 

하시다가 막히는 점이 있으면 언제든지 댓글 달아주세요 :)

댓글
  • 프로필사진 익명 비밀댓글입니다 2022.01.24 23:47
  • 프로필사진 Favicon of https://kingofbackend.tistory.com KoB 노드도 톰캣이랑 똑같습니다.

    1. ALB를 생성합니다. ACM도 생성해줍니다.
    2. Route53에서 A 레코드를 ALB로 설정해줍니다.
    3. ALB에서 타겟그룹으로 노드를 배포한 EC2로 설정합니다.
    4. ALB 80포트의 규칙들은 443포트로 리다이렉션되게 설정해줍니다. 그래야 http로 접속해도 https로 리다이렉션됩니다.
    5. ALB 443 포트의 규칙에서 어느 타겟그룹으로 요청이 갈지 도메인을 설정해줍니다. alb는 L7이기 때문에 host 뿐만 아니라 더 많은 옵션들을 이용해서 다양하게 요청을 보낼수 있습니다.

    글에 정보를 더 추가하였으니 한번 더 확인바랍니다!
    2022.01.25 00:31 신고
  • 프로필사진 익명 비밀댓글입니다 2022.01.30 18:53
  • 프로필사진 Favicon of https://kingofbackend.tistory.com KoB 넵 물론이죠 :) 2022.01.31 11:23 신고
  • 프로필사진 익명 비밀댓글입니다 2022.01.31 11:36
  • 프로필사진 Favicon of https://realapril.tistory.com _April 안녕하세요, 리스너를 만들들고 지정하는 target group은 만들때 어떻게 설정해야하나요? 그냥 기본을 아무것도 안건드리면 되나요? 2022.03.08 01:30 신고
  • 프로필사진 Favicon of https://kingofbackend.tistory.com KoB 만약 target의 포트가 8080이라면 target-group 포트 역시 8080으로 설정 하시면 됩니다.

    따로 VPC를 만들었다면 VPC도 기본 말고 만들어둔 VPC로 설정해야 합니다.

    리스너 -> 타겟 그룹 -> 타겟(EC2)

    이렇게 갑니다.
    2022.03.08 11:48 신고
  • 프로필사진 Favicon of https://dev-bada.tistory.com dev_bada 정보 공유 감사합니다~
    리스너 추가에서 대상 그룹 생성할 때 궁금한 점이 있습니다.
    80과 443 리스너 2개를 생성했는데, 대상 그룹은 80 포트의 대상 그룹, 443 포트의 대상 그룹 각각 다른 걸 적용해야 하나요?
    아니면 80 포트의 대상 그룹 하나를 양쪽에 적용해야 하나요?
    혹은 80 포트의 대상 그룹을 생성하고 대상 등록에 80, 443 두 개를 등록하는게 맞나요?
    2022.03.24 04:21 신고
  • 프로필사진 Favicon of https://kingofbackend.tistory.com KoB 저 같은 경우는 80포트가 http인데 https 사용할거니깐 굳이 http로 통신할 필요가 없다고 느껴서

    http(80포트) 관련된 요청은 https(443포트)로 리다이렉션 시키고,
    https에만 타겟 그룹을 지정해줍니다.

    동일한 대상 그룹으로 80, 443 포트 모두 해도 상관은 없습니다 :)
    2022.03.24 11:10 신고
  • 프로필사진 Favicon of https://ukdae.tistory.com ukdae 톰캣 server.xml에서 포트를 80으로 바꿔줘야하나요 ? 2022.06.05 13:57 신고
댓글쓰기 폼
공지사항
Total
248,427
Today
802
Yesterday
1,065
링크
«   2022/10   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함