JWT + OAuth 2.0
- OAuth로 받은 사용자 정보를 검증 후 자체 JWT 토큰 발급
- Access Token (15분) + Refresh Token (7일) 구조로 보안 강화
- Refresh Token은 Redis에서 관리하여 탈취 시 무효화 가능
- Google, Kakao OAuth 연동으로 소셜 로그인 제공
상세 설계
- Refresh Token Redis 관리: 서버에서 Refresh Token을 저장소에서 직접 관리하므로, 토큰 탈취가 의심될 때 해당 키를 즉시 삭제하여 무효화할 수 있습니다. JWT만으로는 발급 후 서버에서 강제로 만료시킬 수 없지만, Redis에 저장된 Refresh Token은 언제든 삭제 가능합니다.
- Access Token 관리 방식: Access Token은 15분의 짧은 만료시간을 가지므로 별도 저장소 관리 없이 JWT 자체 만료에 의존합니다. 이를 통해 Redis 메모리 사용량을 줄이고 조회 성능을 향상시킵니다.
Redis
- JWT Refresh Token 저장 및 관리
- 실시간 채팅 메시지 Pub/Sub 처리
- 분산 락을 통한 예약 동시성 제어
- 자주 조회되는 업체 정보 캐싱
- 생성된 알림 자동 정리
상세 설계
- 분산 락 동시성 제어: Spring 낙관적 락은 단일 서버에서만 동작하며 여러 Spring Boot 인스턴스 간 동기화가 불가능합니다. Redis 분산 락은 모든 서버가 동일한 Redis를 참조하므로 서버 간 동기화가 가능하고, DB 접근 전에 락으로 차단하여 성능을 향상시킬 수 있습니다.
SET NX
명령어로 락을 획득한 사용자만 예약을 진행하며, 타임아웃 자동 처리로 락 획득 실패 시 즉시 응답합니다. - 채팅 Pub/Sub: Spring STOMP는 단일 서버 내 WebSocket 세션 간 통신만 가능하여, 사용자들이 서로 다른 서버에 연결되면 메시지 전달이 불가능합니다. Redis Pub/Sub은 여러 서버 간 메시지 브로드캐스팅이 가능하므로 어느 서버에 연결된 사용자든 메시지를 수신할 수 있어 확장성을 확보할 수 있습니다.
- 생성된 알림 자동 정리 : 만약 notification 기능을 사용하게 된다면
Docker
- 모든 서비스를 컨테이너로 격리하여 안정성 확보
- Docker Compose로 개발 환경 일관성 유지
- 컨테이너별 리소스 제한 설정으로 메모리 효율 관리
- 개발/운영 환경 통일로 배포 오류 방지
상세 설계
- Docker Compose 환경 일관성: docker-compose.yml 파일에 모든 서비스의 의존성, 포트, 환경변수를 정의하여 개발자마다 다른 환경 설정으로 인한 오류를 방지합니다. 새로운 개발자도
docker-compose up
명령어 하나로 동일한 개발 환경을 즉시 구성할 수 있습니다. - 메모리 효율 관리: t2.micro의 1GB RAM 제한을 고려하여 docker-compose.yml에서 각 컨테이너에 메모리 제한을 설정합니다. (예: Nginx 128MB, Spring Boot 각각 300MB, Redis 100MB, 총 828MB 사용) mem_limit과 mem_reservation 옵션을 통해 최대 사용량과 보장 메모리를 설정하여 메모리 부족으로 인한 서비스 중단을 방지하고 안정적인 멀티 서비스 운영이 가능합니다.
Nginx
- SSL 인증서 적용으로 HTTPS 통신 암호화
- 여러 Spring Boot 인스턴스에 로드 밸런싱 (8080, 8081 포트)
- 특정 경로 접근 제어 및 Rate Limiting 적용
- 정적 파일 서빙 및 리버스 프록시 설정
상세 설계
- 접근 제어 및 Rate Limiting: nginx.conf 설정을 통해 완전히 커스터마이징 가능합니다. 예를 들어
/admin
경로는 특정 IP에서만 접근 가능하도록 제한하고,/api/auth/login
은 분당 10회, 일반 API는 분당 100회로 요청 빈도를 차등 제한하여 DDoS 공격이나 과도한 요청으로부터 서버를 보호합니다. 경로별 접근 제어, IP 화이트리스트, 인증 헤더 검증 등 보안 정책을 유연하게 적용할 수 있습니다. - 리버스 프록시 설정: 클라이언트 요청을 받아 백엔드 Spring Boot 서버로 전달하면서, 실제 서버 IP와 포트를 숨겨 보안을 강화합니다. 또한 Nginx가 정적 파일 요청을 직접 처리하여 Spring Boot 서버의 부하를 줄입니다.
GitHub Actions
- 코드 푸시 시 자동 테스트, 빌드, 배포 실행
- Docker 이미지 자동 생성 및 레지스트리 푸시
- EC2 인스턴스에 무중단 배포 구현
- 배포 실패 시 자동 롤백 기능
Spring Batch
- 기한 만료된 JWT 토큰 자동 정리
- 시스템 , 예약 통계 로그 아카이빙
Prometheus + Grafana
- Spring Boot Actuator 메트릭 수집 및 모니터링
- API 응답시간 및 처리량 측정
- JMeter와 연동한 부하 테스트 진행
- 쿼리 최적화 전후 성능 비교 분석