[프로젝트] S3 + CloudFront + Route53
1. AccessToken 탈취 시 RefreshToken을 이용한 재발급 과정 및 관리 전략
사용자가 로그인하면 AccessToken과 RefreshToken을 서버에서 발급한다.
AccessToken은 HttpOnly 쿠키에 저장하여 XSS 공격을 방지하는 것이 바람직하다고 한다.
RefreshToken도 HttpOnly 쿠키에 저장할 수 있지만, 보안상 세션 저장소(Redis, DB)에서 관리하는 방식도 고려 가능하다.
RefreshToken이 클라이언트에 저장될 경우 CSRF 공격 위험이 존재하므로 SameSite 설정 등을 고려해야 한다.
AccessToken이 탈취되었다면 RefreshToken을 이용해 새로운 AccessToken을 발급해야 한다.
하지만 RefreshToken도 탈취될 가능성이 있으므로 이를 관리하는 전략이 필요하다.
전통적인 기업의 경우 RefreshToken이 탈취되었는지 확인하기 위해 IP, 디바이스 정보를 수집하기도 한다.
의심스러운 접근이 감지되면 해당 Token을 무효화하기도 한다.
Redis를 사용하는 이유는 세션 방식과 달리 분산 환경에서도 중앙화된 저장소를 활용할 수 있고 고속 조회가 가능하여 빠른 인증 처리가 가능하다.
또한 Redis TTL을 설정해 자동 만료처리를 할 수 있다.
2. 다중 로그인 관리
다중 로그인 허용 여부에 따라서 RefreshToken 저장 방식이 달라진다.
단일 로그인의 경우 기존 RefreshToken을 무효화하고 새로운 RefreshToken을 발급받으면 되늰데 다중 로그인을 허용할 경우 사용자가 여러 개의 RefreshToken을 가질 수 있다.
Redis에서 RefreshToken을 JSON 형식으로 저장할 때 아래와 같이 사용자별로 배열 형태로 저장할 수 있다.
{
"haru": [
{ "refreshToken": "abc123", "device": "PC", "ip": "192.168.0.1", "issuedAt": "2025-02-08T10:00:00Z" },
{ "refreshToken": "xyz789", "device": "Mobile", "ip": "192.168.0.2", "issuedAt": "2025-02-08T12:00:00Z" }
]
}
관리 정책에 따라 최대 개수를 제한하거나 RefreshToken 만료 시 자동 삭제를 위한 TTL을 설정할 수 있다.
또한 RefreshToken 탈취를 방지하기 위해 스케줄링 작업을 수행하여 오래된 Token을 정리하거나 의심스러운 활동이 감지되면 해당 사용자의 모든 RefreshToken을 강제 만료 처리할 수 있다.
3. S3 (Simple Storage Service)
S3는 AWS에서 제공하는 객체 스토리지 서비스로 데이터를 클라우드에 저장하고 어디서나 접근할 수 있도록 하는 서비스다.
S3를 사용하는 이유는 아래와 같다.
1) 정적 웹사이트 호스팅 가능(React, Vue, Angular 등의 정적 파일 저장)
2) 파일 저장 및 백업 용도
3) 고가용성 및 확장성(서버 다운 없이 지속적으로 접근 가능)
4) 저렴한 저장 비용
S3의 장점은 서버리스로 별도의 서버 없이도 정적 웹사이트 호스팅이 가능하고 비용이 사용량에 따라 요금이 부과되어 효율적이다. 또한 IAM, 버킷 정책, ACL 등으로 보안 기능이 제공된다.
다만 React/Vue와 같은 SPA는 가능하지만 서버 측 API 기능이 따로 필요하면 EC2, Lambda, API Gateway와 연동해야 한다.
4. CloudFront
CloudFront는 AWS의 CDN(Content Delivery Network) 서비스로 전 세계 엣지 로케이션을 통해 S3 콘텐츠를 캐싱하여 빠르게 제공한다.
CloudFront를 사용하는 이유는 S3 정적 웹사이트 배포 시 HTTPS 지원이 가능하고 S3의 직접적인 퍼블릭 접근을 차단하여 보안을 강화하고 사용자와 가까운 CDN 서버에서 콘텐츠를 제공하여 로딩 속도가 개선된다.
AWS ACM과 연동하여 SSL 인증서도 적용이 가능하고 AWS Shield Standard를 기본으로 제공한다.
5. ACM(AWS Certificate Manager)
ACM은 AWS에서 SSL/TLS 인증서를 무료로 관리해주는 서비스다.
CloudFront, ALB, API Gateway 등과 연동하여 HTTPS를 활성화하는데 사용된다.
ACM을 사용하는 이유는 CloudFront를 통한 HTTPS 적용과 무료 SSL 인증서(AWS 서비스 전용), 자동 갱신 지원 등의 이유로 사용한다. 나는 Route53과 연동하려고 한다.
6. Route 53
Route 53은 AWS의 도메인 네임 시스템(DNS) 서비스로 CloudFront, S3, EC2 등에 도메인을 연결하는 역할을 한다.
도메인 구매 및 관리가 가능한데 나는 가비아로 구매를 하였다.
CloudFront와 연동하여 도메인으로 정적 사이트 배포가 가능하다.
다만 월 0.5 달러의 기본 요금이 발생한다고 한다.