앱에서 소셜 로그인 기능을 제공하고자 한다. 그런데 IOS 앱에서 소셜 로그인 기능을 사용하기
위해 서는 애플 로그인 필수로 들어가야, 다른 소셜 로그인(카카오, 구글 등)을 제공할 수 있다.
문제는 문제를 낳고.. 애플 로그인 기능을 구현하기 위해서는 HTTPS 프로토콜이 필수란다.
가용영역에 있는 대상으로 들어오는 트래픽을 자동으로 분산시켜주는 서비스이다.
OSI 계층 별로 제공하는 여러 서비스가 있다.
Classic Load Balancer (4.7 계층에서 동작)
Gateway Load Balancer (3계층의 게이트웨이 로드밸런싱 + 4계층 로드 밸런싱)
Network Load Balancer (4계층에서 동작)
Application Load Balancer (7계층에서 동작)
각 계층별로 확인할 수 있는 정보가 다르기 때문이다.
3~4계층에서 동작하는 Gateway Load Balancer는 MAC주소, IP주소를 기반으로 로드밸런싱을 할 수 있다.
4계층에서 동작하는 Network Load Balancer는 MAC주소, IP주소, port번호를 기반으로 로드밸런싱 할 수 있다.
7계층에서 동작하는 Application Load Balancer는 MAC주소, IP주소, port번호, URL을 기반으로 로드밸런싱 할 수 있다. 또한 HTTP 헤더 정보를 통해서도 분산이 가능하다.
이처럼 높은 계층에서의 로드밸런서가 좀 더 많은 정보를 기반으로 세부적으로 로드밸런싱 할 수 있다.
이외에도 여러가지 이유가 있는데 이는 문서를 확인하자.
AWS Elastic Load Balancing이라는 서비스가 있고, 이 서비스에서 지원하는 로드밸런서 중 하나가 Application Load Balancer 이다.
Application Load Balancer는 7계층에서 동작하며 트래픽을 분산시켜주는 역할을 수행하는 로드밸런서다.
등록된 대상의 상태를 모니터링하면서, 문제 없는 대상으로만 트래픽을 라우팅한다.
라우팅 할 때는 기본적으로 라운드 로빈 알고리즘을 사용한다. 자세한건 아래에서 살펴보자.
위 문제를 해결하기 위한 기능이 교차 영역 로드밸런싱(Cross Zone Load Balancing)이다.
AZ를 구분하지 않고 트래픽을 분산시킨다.
ALB 경우 기본적으로 활성화 되어 있으며, NLB는 기본적으로 비활성화 되어있다.
클라이언트에 대한 단일 진입점 역할을 수행한다.
클라이언트는 로드밸런서에 요청을 전송하고, 로드밸런서는 EC2 인스턴스 같은 대상으로 요청을 라우팅한다.
로드 밸런서를 구성하기 위해서는 Target group과 Listener가 필요하다.
Listener는 구성한 프로토콜 및 포트를 사용하여 연결 요청을 확인하는 프로세스다.
리스너에 정의한 규칙에 따라 로드밸런서가 EC2 같은 대상으로 요청을 라우팅한다.
정의할 수 있는 규칙은 예로 아래와 같은 것들이 있다.
특정 URL로 인입된 요청을 다른 URL로 리다이렉트
http로 들어온 요청을 https로 리다이렉트
각 Target group별로 요청을 분산시킬 퍼센트 지정
7계층에서 동작하는 ALB는 HTTP, HTTPS 프로토콜을 지원한다.
Listener 규칙을 생성할 때, Target group을 지정한다. 해당 규칙이 충족되면 지정한 Target group으로 트래픽이 전달된다.
Load balancer는 Target group 단위로 상태를 확인한다. (health check)
클라이언트가 도메인 주소를 통해 요청한다.
Amazon의 DNS 서버에 요청해서 도메인 주소를 통해 ELB의 Network Interface(ALB Node)의 IP 리스트를 클라이언트에게 전달한다.
클라이언트는 IP중 하나를 선택한다.
선택한 IP의 ALB 노드가 요청을 받고, 리스너에게 전달한다.
리스너는 규칙에 맞는 Target group으로 트래픽을 전달한다.
Target group은 라운드로빈 알고리즘을 통해 특정 EC2에 트래픽을 전달하여 요청을 처리한다.
3번 과정에서 클라이언트가 IP중 하나를 선택한다고 했다.
그러면 특정 IP만 계속 선택하면 결국 로드가 불균형해지는게 아닌가 싶었지만
위에서 이야기한 교차 영역 로드밸런싱 때문에, 각 인스턴스가 받는 트래픽은 균형을 이루게 된다.
또한 EC2를 계속 이야기했지만, EC2 뿐만 아니라 람다 같은 것도 대상이 될 수 있다.
Listener가 Target group으로 전달한 트래픽을, 여러 EC2 중 어떤 EC2로 트래픽을 전달할까? 그리고 어떻게 균형있게 전달할 수 있는걸까?
기본적으로 라운드 로빈 라우팅 알고리즘을 사용한다.
트래픽을 순차적으로 배정한다.
각 서버가 동일한 스펙을 가지고, 세션이 오래 지속되지 않는 경우에 적합하다.
이런 이유로 ALB는 기본적으로 라운드 로빈 라우팅 알고리즘을 사용한다.
이로 인해 LOR 알고리즘을 추가했다.
LOR 알고리즘은 간단하다. 요청이 가장 적은 대상에 요청을 전달한다.
AWS ELB 서비스에 대해 알아봤고 이제 서비스를 이용해보자.
AWS에서 인증서를 발급받은 도메인을 사용하기 위해서는 로드밸런서를 이용해야 한다.
ALB란 Applcation Load Balancer이다. ELB(Elastic Load Balancer)라고도 부른다.
로드 밸런서란 간단히 이야기 하면, 여러 서버가 띄워져 있을 때 , 클라이언트로 부터 인입되는
요청을 로드밸런서 한곳에서 모두 요청을 받고, 각 서버에게 분배해주는 서버를 의미한다.
ALB는 각 그룹별로 요청을 분산해주고, 각 가용역역에 있는 ALB 노드가 각 인스턴스들에게 요청을
분산 시켜준다.
가용영역 설정 시 인스턴스의 가용영역을 포함시켜야 한다.
@RestController
public class HealthController {
@GetMapping("/")
public ResponseEntity<HttpStatus> healthCheck(){
return new ResponseEntity<>(HttpStatus.OK);
}
}
---
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated();
}
}
거의 다 왔다.
이제 생성한 ALB와, 구매한 도메인을 연결하는 과정이다.
API 서버라서 안해도 될 것 같지만, SSR형태로 서버를 구축해서 웹 서비스를 제공한다면
필요할 것 같다. http://example.com
으로 요청이 들어오면 → 자동으로
https://example.com
으로 리다이렉션 하도록 해주는 것이다.
애플리케이션 레벨에서 리다이렉트 할 때는 아래처럼 프로퍼티 파일을 통해 설정할
수 있는 것 같다. 이 부분은 확인하지는 않았으니 참고만 하자.
application.yaml
server:
tomcat:
use-relative-redirects: true
중간에 삽질을 조금 하긴 했지만, 다 하고보면 생각보다 간단한 것 같다.
이제 Apple 로그인을 구현할 준비가 됐다.
AWS ELB(Elastic Load Balancing) 생성 후 EC2 연동 & 외부 도메인 연동
[AWS] Amazon Certificate Manager로 HTTPS 적용해보기
[AWS] Amazon Certificate Manager로 HTTPS 적용해보기
AWS SSL(HTTPS) 적용 방법 - 도메인 구입 Route 53(1)
감사합니다.