일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
- Today
- Total
기록
AWS Elasticache를 Spring Boot에 연결하기 본문
시작하기
로그인 시스템에서 중요한 과제 중 하나는 사용자 인증 토큰의 안전한 저장과 관리입니다. 이번 포스팅에서는 AWS Elasticache Redis를 활용하여 스프링 부트 프로젝트에 확장 가능한 인증 시스템을 구축하는 방법을 공유하려고 합니다. 이전 포스팅에서는 인메모리 Map을 사용해 로컬 환경에서 간단한 토큰 관리를 구현했습니다.([Web/Spring] - 테스트 환경에서의 In-Memory Map을 활용한 로그인/로그아웃 시스템 구현) 이번에는 이를 기반으로 Elasticache Redis로 확장하여 분산 환경에서도 안정적으로 인증 시스템을 운영하는 방법을 다룹니다.
1. 소개
Redis는 다음과 같은 이유로 인증 토큰 관리에 적합합니다:
- 빠른 키-값 조회: 로그인 토큰의 저장과 조회 속도가 빠릅니다.
- TTL 설정 가능: 자동 만료 기능으로 불필요한 토큰을 제거합니다.
- 분산 환경 지원: 여러 서버 간 상태를 공유할 수 있습니다.
2. AWS Elasticache 설정
2.1 Elasticache Redis 클러스터 생성
- AWS 콘솔에서 Elasticache 서비스를 선택합니다.
- Redis 클러스터를 생성하고 아래 항목을 설정합니다:
- 엔진 버전: 최신 안정 버전 선택
- 노드 유형: 개발 환경에서는 작은 인스턴스(e.g.,
cache.t2.micro
) - VPC: 기존 VPC 선택 또는 새로운 VPC 생성
- 서브넷 그룹 및 보안 그룹 설정
- 이전 글 참조([DevOps] - [AWS] Elasticache 생성과 연결 확인)
2.2 보안 그룹 및 네트워크 설정
- 보안 그룹: EC2 및 애플리케이션 서버가 클러스터에 접근할 수 있도록 Inbound 규칙에 Redis 포트(6379)를 허용합니다.
- VPC 피어링: 애플리케이션 서버(EC2)와 Redis 클러스터가 같은 VPC에 있어야 연결이 가능합니다.
(1) Inbound 규칙
- Redis는 기본적으로 포트 6379를 사용합니다.
- 외부에서 접근하지 못하도록 허용된 IP 또는 VPC 내부 트래픽만 허용해야 합니다.
유형 | 프로토콜 | 포트 범위 | 소스 |
---|---|---|---|
Custom TCP Rule | TCP | 6379 | <애플리케이션 서버 IP> |
Custom TCP Rule | TCP | 6379 | sg-xxxxxxx (같은 VPC 내 다른 보안 그룹) |
(2) Outbound 규칙
- Redis 클러스터에서 다른 AWS 서비스와 통신이 필요하지 않으므로 기본적으로 모든 아웃바운드 트래픽 허용으로 유지하거나, 필요한 경우 최소화합니다.
유형 | 프로토콜 | 포트 범위 | 목적지 |
---|---|---|---|
All Traffic | All | All | 0.0.0.0/0 |
2.3 클러스터 엔드포인트 확인
- AWS 콘솔의 Elasticache 클러스터 상세 정보에서 엔드포인트를 확인합니다.
- 연결 테스트: Redis CLI를 사용하여 연결을 확인합니다.
redis-cli --tls -h <elasticache-endpoint> -p 6379 PING
2.4 인증서를 활용한 TLS 연결
Elasticache Redis는 기본적으로 TLS(Transport Layer Security)를 사용해 데이터를 암호화합니다. 이를 위해 AWS는 공인 인증서를 제공합니다.
- Redis CLI를 통한 인증서 설정:이를 통해 Redis 클라이언트와 서버 간 안전한 연결을 보장할 수 있습니다.
redis-cli --tls -h <elasticache-endpoint> -p 6379
참고: 인증서를 사용하지 않고 연결하려고 하면 SSL Handshake 오류와 같은 문제가 발생할 수 있습니다. AWS Elasticache는 TLS를 요구하므로 인증서를 설정하는 것이 중요합니다.
3. Spring Boot에서 Elasticache Redis 연결
3.1 Gradle 의존성 추가
Redis를 사용하기 위해 Spring Data Redis와 관련 라이브러리를 추가합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.lettuce.core:lettuce-core'
}
3.2 Redis 설정 클래스 작성
useSsl
옵션을 포함하여 Elasticache Redis와의 연결을 설정하기 위해 RedisConfig
클래스를 작성합니다. useSsl 옵션이 제대로 설정되지 않는 경우, 연결이 지연되어 timeOut 오류를 만날 수 있습니다.
@Configuration
class RedisConfig(
@Value("\${spring.data.redis.host}") private val redisHost: String,
@Value("\${spring.data.redis.port}") private val redisPort: Int,
@Value("\${spring.data.redis.usessl}") private val useSsl: Boolean
) {
@Bean
fun redisConnectionFactory(): LettuceConnectionFactory {
val config = RedisStandaloneConfiguration()
config.hostName = redisHost
config.port = redisPort
val clientConfig = LettuceClientConfiguration.builder()
if (useSsl) {
clientConfig.useSsl() // SSL 설정 활성화
}
return LettuceConnectionFactory(config, clientConfig.build())
}
@Bean
fun redisTemplate(): RedisTemplate<String, String> {
val template = RedisTemplate<String, String>()
template.setConnectionFactory(redisConnectionFactory())
return template
}
}
3.3 application.yml 설정
redisPassword
를 제외하고 useSsl
설정을 추가한 application.yml
파일입니다:
spring:
data:
redis:
host: <elasticache-endpoint>
port: 6379
usessl: true
4. Redis 헬스체크 API 작성
Elasticache Redis의 연결 상태를 확인하는 간단한 API를 작성합니다.
@RestController
@RequestMapping("/api/open/healthCheck")
class RedisHealthCheckController(
private val redisTemplate: RedisTemplate<String, String>
) {
@GetMapping("/redis")
fun checkRedisHealth(): ResponseEntity<Map<String, Any>> {
return try {
val connection = redisTemplate.connectionFactory?.connection
val response = mutableMapOf<String, Any?>()
response["password"] = if (connection?.config("requirepass") == null) "not set" else "set"
response["port"] = 6379 // 기본 Redis 포트
response["ping"] = connection?.ping() ?: "No Response"
response["host"] = (redisTemplate.connectionFactory as LettuceConnectionFactory).hostName
response["ssl"] = (redisTemplate.connectionFactory as LettuceConnectionFactory).isUseSsl
response["timeout"] = (redisTemplate.connectionFactory as LettuceConnectionFactory).clientConfiguration.commandTimeout.seconds * 1000
response["status"] = if (response["ping"] == "PONG") "UP" else "DOWN"
ResponseEntity.ok(response)
} catch (e: Exception) {
ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
mapOf(
"status" to "DOWN",
"error" to e.message
)
)
}
}
}
5. 결과 확인
5.1 Postman으로 API 테스트
/api/open/healthCheck/redis
엔드포인트로 GET 요청을 보냅니다.- 응답의 status가 UP이면 성공적으로 연결된 것입니다.
5.2 Elasticache에서 데이터 확인
- Redis CLI를 사용해 클러스터에 접속합니다.
- 저장된 키/값을 확인합니다:
redis-cli --tls -h <elasticache-endpoint> -p 6379
> keys *
6. 결론
Elasticache Redis를 활용하면 다음과 같은 이점이 있습니다:
- 확장성: 분산 환경에서도 안정적인 토큰 관리가 가능.
- 안정성: 내구성 있는 캐시로 데이터 유실 방지.
- 유연성: TTL을 활용해 만료 정책 관리.
Elasticache Redis를 연결할 때 발생할 수 있는 useSsl
관련 문제는 설정 파일에서 적절히 해결해야 합니다. 특히 AWS 환경에서는 TLS 활성화 여부를 항상 확인하고, 연결해야 합니다.
'Web > Spring' 카테고리의 다른 글
JWT와 Redis를 활용한 사용자 인증 프로세스 설계 (0) | 2024.12.31 |
---|---|
테스트 환경에서의 In-Memory Map을 활용한 로그인/로그아웃 시스템 구현 (0) | 2024.12.30 |
Spring/이벤트 처리 예제 - ApplicationEvent, 모듈화와 확장성을 향상시키는 방법 (0) | 2024.12.16 |
RabbitMQ와 스프링 부트를 활용한 간단한 메시징 시스템 구축하기 (0) | 2024.12.08 |
CORS 오류 해결하기: Spring Boot와 Swagger (0) | 2024.11.11 |