AWS Route 53은 Amazon Web Services(AWS)에서 제공하는 확장 가능한 클라우드 도메인 네임 시스템(DNS) 웹 서비스입니다. Route 53은 높은 가용성과 확장성을 제공하며, 사용자가 손쉽게 도메인을 관리하고 트래픽을 라우팅할 수 있도록 설계되었습니다.
2. Route 53의 주요 기능
도메인 등록
Route 53을 통해 도메인 이름을 구매, 등록, 관리할 수 있습니다.
기존 도메인을 Route 53으로 이전할 수도 있습니다.
DNS 관리
Route 53은 트래픽을 도메인 이름에서 AWS 리소스(EC2, S3, CloudFront 등)로 라우팅하거나 외부 리소스로 라우팅할 수 있습니다.
A, AAAA, CNAME, MX 등 다양한 DNS 레코드 유형을 지원합니다.
트래픽 라우팅 정책
다양한 라우팅 정책을 제공하여 트래픽 흐름을 유연하게 제어할 수 있습니다.
단순 라우팅(Simple Routing): 단일 리소스로 트래픽 라우팅.
지연 시간 기반 라우팅(Latency Routing): 가장 짧은 지연 시간을 제공하는 리소스로 트래픽 라우팅.
가중치 기반 라우팅(Weighted Routing): 리소스별로 비율을 설정하여 트래픽 분배.
장애 조치 기반 라우팅(Failover Routing): 리소스 장애 시 대체 리소스로 트래픽 라우팅.
지리적 라우팅(Geolocation Routing): 사용자 위치에 따라 트래픽 라우팅.
지리 근접성 라우팅(Geoproximity Routing): 리소스와 사용자 간의 거리 기준으로 트래픽 라우팅.
헬스 체크 및 모니터링
도메인의 가용성을 모니터링하고 헬스 체크를 통해 장애 감지 시 자동으로 트래픽을 다른 리소스로 라우팅.
통합 관리
AWS 리소스(S3, EC2, CloudFront 등)와 쉽게 통합되어 손쉬운 DNS 구성 가능.
호스팅 영역
Route 53에서 도메인의 호스팅 영역을 생성하여 DNS 레코드를 관리.
3. Route 53의 주요 사용 사례
AWS 리소스 연결
도메인 이름을 EC2, S3, CloudFront 등 AWS 리소스와 연결.
글로벌 트래픽 라우팅
다양한 라우팅 정책(지연 시간 기반, 지리적 라우팅 등)을 사용해 글로벌 트래픽을 최적화.
SSL/TLS 인증서는 웹 애플리케이션 데이터를 안전하게 보호하기 위해 HTTPS를 적용하는 데 필수적입니다. AWS 환경에서 HTTPS를 설정할 때 자주 비교되는 두 가지 옵션이 있습니다. AWS Certificate Manager (ACM)와 Let's Encrypt. 이번 글에서는 두 방법의 특징, 장단점, 차이점, 그리고 적합한 사용 사례를 비교해 보겠습니다.
1. AWS Certificate Manager (ACM)
AWS Certificate Manager (ACM)은 AWS에서 제공하는 SSL/TLS 인증서 발급 및 관리 서비스로 AWS 리소스에서 HTTPS를 적용하는 데 최적화된 도구입니다.
특징
AWS 리소스 전용: ACM 인증서는 AWS 리소스(CloudFront, ELB, API Gateway)에서만 사용할 수 있습니다.
자동 갱신: 인증서를 수동으로 갱신할 필요 없이 자동 갱신됩니다.
도메인 검증: DNS 또는 이메일을 통해 소유권을 검증합니다.
무료 제공: AWS 리소스와 연동 시 추가 비용 없이 사용할 수 있습니다.
장점
AWS 서비스와 강력한 통합:
CloudFront, ELB, API Gateway 등과 몇 번의 클릭만으로 HTTPS를 설정할 수 있습니다.
자동 갱신:
인증서 만료 걱정 없이 자동으로 갱신됩니다.
비용 효율성:
AWS 리소스 내에서 사용 시 무료입니다.
단점
제한된 사용 환경:
ACM 인증서는 AWS 리소스 외부에서는 사용할 수 없습니다.
DNS 설정 복잡성:
도메인 소유권 확인 과정에서 DNS CNAME 설정 작업이 필요할 수 있습니다.
적합한 사용 사례
AWS 리소스를 기반으로 운영되는 애플리케이션에서 HTTPS 설정.
자동 갱신과 관리의 편리함이 중요한 경우.
2. Let's Encrypt
Let's Encrypt는 비영리 기관에서 제공하는 무료 SSL/TLS 인증서 발급 서비스로, AWS뿐 아니라 모든 서버 환경에서 HTTPS 적용이 가능합니다.
특징
범용 사용 가능: AWS 외에도 EC2, Nginx, Apache 등 다양한 환경에서 사용할 수 있습니다.
자동 발급 및 갱신 지원: Certbot 같은 도구를 사용하면 인증서를 자동으로 발급 및 갱신할 수 있습니다.
무료 제공: 누구나 무료로 SSL 인증서를 사용할 수 있습니다.
장점
범용성:
AWS 외 서버나 클라우드 환경에서도 사용 가능합니다.
무료:
전 세계 누구나 인증서를 무료로 발급받을 수 있습니다.
오픈 소스 도구 활용:
Certbot과 같은 오픈 소스 도구를 사용해 설정을 자동화할 수 있습니다.
단점
수동 설정 필요:
초기 설정에서 Certbot 설치 및 자동화 스크립트 작성이 필요합니다.
짧은 유효 기간:
인증서 유효 기간이 90일로 짧아 정기적인 갱신이 요구됩니다.
적합한 사용 사례
EC2에서 Nginx, Apache 같은 웹 서버와 HTTPS 설정.
AWS 외부 또는 온프레미스 환경에서 HTTPS가 필요한 경우.
비용을 최소화하면서 유연한 HTTPS 설정을 원하는 경우.
3. 주요 차이점 비교
항목ACMLet's Encrypt
비용
무료
무료
사용 환경
AWS 리소스 전용
범용 (AWS, Nginx, Apache 등 모든 서버)
도메인 검증 방식
DNS 검증, 이메일 검증
HTTP 검증, DNS 검증
자동 갱신
완전 자동
Certbot 등으로 자동화 가능
유효 기간
무제한 (AWS에서 자동 갱신)
90일
설정 난이도
쉬움 (AWS와 통합)
중간 (Certbot 설치 및 구성 필요)
4. 선택 가이드: 언제 무엇을 사용할까?
ACM을 선택해야 할 때
AWS 서비스를 중심으로 애플리케이션을 운영 중일 때.
ELB, CloudFront, API Gateway와 HTTPS를 간편하게 연결하고 싶을 때.
Redis와 동일한 네트워크에 연결하지 않으면 Connection refused 에러가 발생합니다.
4.4 Spring Boot 설정 변경
Spring Boot 애플리케이션의 application.yml에서 Redis 호스트 이름을 redis로 변경합니다.
spring:
data:
redis:
host: redis
port: 6379
host: redis: Docker 네트워크 내에서 Redis 컨테이너의 이름을 호스트로 지정
4.5 컨테이너 상태 확인
컨테이너들이 제대로 실행되고 있는지 확인합니다.
docker ps
출력
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d2f25acb373 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
de6bb85de644 <image이름> "java -Dspring.profi…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp <설정한 이름>
5. Redis 연결 테스트
Spring Boot 애플리케이션 내에서 Redis 연결이 제대로 이루어졌는지 확인합니다.
5.1 컨테이너 내부에서 Redis CLI 테스트
social-media 컨테이너 내부에서 Redis CLI를 설치한 후 Redis에 연결해보세요.
@AuthenticationPrincipal과 @PreAuthorize는 모두 인증된 사용자에 대한 정보를 가져오거나 접근 제어를 구현하는 데 사용되지만, 목적과 사용 방식이 다릅니다.
1. @AuthenticationPrincipal
@AuthenticationPrincipal은 현재 인증된 사용자의 정보를 메서드의 파라미터로 주입할 때 사용됩니다. 이를 통해 컨트롤러 메서드 내부에서 인증된 사용자 정보를 직접 사용할 수 있습니다.
예를 들어, @AuthenticationPrincipal을 사용하여 userId를 메서드 파라미터로 전달받으면, 인증된 사용자의 ID 또는 UserDetails 객체를 사용할 수 있게 됩니다.
@DeleteMapping("/posting/{postingId}")
public ResponseEntity<Void> deletePostingById(
@PathVariable Long postingId,
@AuthenticationPrincipal String userId) {
// userId를 통해 현재 사용자 정보를 확인하고 처리
postingService.deletePostingByUserAndId(userId, postingId);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
주요 특징:
인증된 사용자 객체(UserDetails 또는 userId)를 직접 파라미터로 받습니다.
메서드 내부에서 인증된 사용자의 정보를 활용하여 원하는 로직을 구현할 수 있습니다.
@AuthenticationPrincipal은 보통 인증된 사용자 정보를 쉽게 활용하기 위해 컨트롤러 메서드의 파라미터로 주입하는 데 주로 사용됩니다.
2. @PreAuthorize
@PreAuthorize는 메서드 호출 전에 권한을 검사하는 데 사용됩니다. @PreAuthorize는 SpEL(스프링 표현 언어)을 사용하여 권한 조건을 정의하며 해당 조건을 만족해야만 메서드를 실행할 수 있습니다.
예를 들어 특정 게시글의 작성자인 경우에만 삭제할 수 있도록 @PreAuthorize를 사용해 권한을 제한할 수 있습니다.
@PreAuthorize("@postingService.isOwner(authentication, #postingId)")
@DeleteMapping("/posting/{postingId}")
public ResponseEntity<Void> deletePostingById(@PathVariable Long postingId) {
postingService.deletePostingById(postingId);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
주요 특징:
메서드 실행 전에 권한 조건을 평가하여 접근 제어를 수행합니다.
authentication 객체나 파라미터(예: #postingId)를 사용하여 권한 검사 로직을 정의할 수 있습니다.
서비스 또는 리포지토리 메서드에서도 사용할 수 있으며, 메서드 자체에 대한 접근 제어를 수행합니다.
차이점 요약
기능 @AuthenticationPrincipal @PreAuthorize
주요 목적
인증된 사용자 정보 주입
메서드 호출 전 접근 권한 검사
사용 위치
컨트롤러 메서드 파라미터
컨트롤러 또는 서비스 메서드
적용 대상
인증된 사용자 정보 (UserDetails 또는 ID)
권한 검사 조건 (SpEL 사용)
권한 검사 시점
메서드 내부에서 권한 검사 로직을 추가해야 함
메서드 호출 전 권한 검사 자동 수행
결국 @AuthenticationPrincipal은 인증된 사용자 정보를 파라미터로 주입하여 로직에서 활용할 때 유용하고 @PreAuthorize는 특정 권한이나 조건을 만족할 때만 메서드를 호출하도록 보장할 때 적합합니다.