안녕하세요. 이 글은 AWS RDS에 인증할 때 비밀번호 없이 로그인하는 방법을 소개합니다.

데이터베이스 인증이란
데이터베이스에 접근하려면 인증 과정을 거쳐야 합니다. 계정과 비밀번호를 올바르게 입력해야 인증이 성공하며, 인증에 실패하면 데이터베이스에 접근할 수 없습니다.
데이터베이스 인증의 위험
데이터베이스 인증은 비밀번호가 필요하기 때문에, 비밀번호가 실수로 유출되면 데이터베이스가 위험에 노출됩니다. 특히 개인정보가 포함된 데이터베이스이거나 주요정보통신기반시설 시스템인 경우, 내부관리계획에 따라 비밀번호 로테이션과 복잡도를 법적으로 점검해야 합니다.

데이터베이스 비밀번호 유출 위험 최소화하는 방법
데이터베이스 비밀번호 유출을 최소화하는 방법은 두 가지입니다.
- 주기적으로 데이터베이스 비밀번호 교체
- 데이터베이스 접근할 때 임시 비밀번호 발급
RDS IAM 인증
AWS에서는 RDS에 접근할 때 임시 비밀번호를 발급해주는 기능을 제공합니다. 정확히 말하면 15분 동안 유효한 임시인증토큰을 발급해주는 기능이 있습니다. 임시인증토큰으로 인증하기 때문에, 데이터베이스 비밀번호는 인증 과정에서 사용하지 않아도 됩니다.

client는 AWS SDK의 generate-db-auth-token 함수를 호출하여 임시인증토큰을 발급받습니다. 발급받은 임시인증토큰을 비밀번호 대신 사용하여 RDS에 접근할 수 있으며, RDS는 이 토큰을 검증하여 요청 허용 여부를 결정합니다.

임시인증토큰의 구조
임시인증토큰은 AWS Signature Version 4로 서명되어 있으며, 다음 정보를 포함합니다:
- 데이터베이스 호스트명과 포트
- 데이터베이스 사용자명
- 서명 알고리즘
- 유효기간 (900초 = 15분)
- AWS 자격 증명 정보

기능 제한
RDS IAM 인증의 제한 사항은 AWS 공식 문서에서 확인할 수 있습니다.
주요 제한 사항은 다음과 같습니다.
- 초당 200개 이상의 RDS IAM 인증 요청을 처리할 수 없습니다. AWS 문서에서는 데이터베이스 커넥션 풀 사용을 권장합니다.
- 임시토큰을 무효화하는 revoke 기능이 없습니다.
- IAM Administrator 권한이 있으면 모든 데이터베이스 계정에 대해 IAM 임시인증토큰을 발급받을 수 있습니다.
- SSL 모드를 필수로 사용해야 합니다. AWS CA 인증서가 없는 OS나 시스템은 AWS CA 번들 인증서를 미리 준비해야 합니다.
- Database IDE가 IAM 인증을 지원하지 않으면, 세션이 종료될 때마다 임시인증토큰을 발급받아 수동으로 입력해야 합니다.
- 기존 데이터베이스 계정에 RDS IAM 인증을 적용하면 PostgreSQL에서 오류가 발생할 수 있습니다. PostgreSQL은 RDS IAM 인증 방식의 우선순위가 더 높아 비밀번호 방식을 사용하는 로직에 문제가 생길 수 있습니다.

모니터링
RDS IAM 인증 메트릭을 지원하므로 CloudWatch에서 쉽게 모니터링할 수 있습니다.


설정방법
RDS IAM 인증을 사용하려면 총 3가지 설정이 필요합니다.
- RDS 설정
- IAM 설정
- 데이터베이스 설정
RDS 설정
RDS에서 IAM database authentication 설정을 활성화합니다.

Terraform에서는 iam_database_authentication_enabled 속성을 true로 변경하면 됩니다.
resource "aws_rds_cluster" "mysql" {
cluster_identifier = "${var.project_name}"
iam_database_authentication_enabled = true
...
}
IAM 설정
IAM에서는 IAM role을 생성하고 IAM policy를 설정합니다. IAM policy에서는 rds-db:connect 권한을 설정해야 합니다. 권한 대상은 RDS resource ID와 데이터베이스 계정입니다. 즉, IAM role이 인증할 때 어떤 데이터베이스의 계정으로 인증할지 설정해야 합니다.

데이터베이스 설정
데이터베이스에서는 데이터베이스 계정이 IAM 인증을 사용할 수 있도록 설정해야 합니다.
PostgreSQL
CREATE USER db_userx;
GRANT rds_iam TO db_userx;
MySQL
CREATE USER IF NOT EXISTS 'db_user'@'%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
ALTER USER 'db_user'@'%' REQUIRE SSL;
RDS IAM 인증 마이그레이션
아직 테스트하지 않았지만, 비밀번호 인증을 사용 중인 데이터베이스 계정에 RDS IAM 인증을 적용하면 서비스 장애가 발생할 수 있습니다. PostgreSQL에서는 RDS IAM 인증 방식의 우선순위가 더 높기 때문입니다.

따라서 RDS IAM 인증 마이그레이션은 새로운 데이터베이스 계정을 만들어 RDS IAM 인증을 적용하고, 애플리케이션에서 이 계정을 사용하도록 배포하는 방식이 좋습니다. 두 개의 계정을 사용하면 무중단 마이그레이션이 가능하고 롤백도 쉽습니다.
실습
실습 코드는 제 GitHub에 공개되어 있으며, 크게 2가지로 구성되어 있습니다.
AWS CLI로 RDS IAM 인증
AWS CLI 실습에서는 generate-db-auth-token으로 RDS 임시인증토큰을 발급받고, mysql 또는 psql로 RDS에 접근할 때 이 토큰을 사용합니다.
TOKEN=$(aws rds generate-db-auth-token \
--hostname $MYSQL_HOST \
--port 3306 \
--region ap-northeast-2 \
--username iam_user)
mysql -h $MYSQL_HOST \
--port 3306 \
--ssl-mode=DISABLED \
--user=iam_user \
--password="$TOKEN" \
--enable-cleartext-plugin


Spring Boot에서 RDS IAM 인증
Spring Boot에서는 aws-advanced-jdbc-wrapper를 사용하며, datasource.url에 wrapperPlugins=iam을 설정합니다. driver-class-name은 software.amazon.jdbc.Driver로 변경해야 합니다. 자세한 동작 원리와 코드 설명은 아래 블로그를 참고하세요.
jdbc:aws-wrapper:mysql://<hostname>:<port>/<database>?wrapperPlugins=iam&iamRegion=<region>&sslMode=require
spring:
application:
name: iam-auth
datasource:
url: jdbc:aws-wrapper:mysql://${RDS_HOSTNAME}:${RDS_PORT:3306}/${RDS_DATABASE:demo}?wrapperPlugins=iam&iamRegion=${AWS_REGION:ap-northeast-2}&sslMode=require
username: ${RDS_USERNAME:iam_user}
driver-class-name: software.amazon.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 5
max-lifetime: 840000
참고자료
- https://aws.amazon.com/ko/blogs/database/securing-amazon-rds-and-aurora-postgresql-database-access-with-iam-authentication/
- https://aws.amazon.com/ko/blogs/database/using-iam-authentication-to-connect-with-pgadmin-amazon-aurora-postgresql-or-amazon-rds-for-postgresql/
- https://www.youtube.com/watch?v=y2QsuwZGZ54
- https://zerone-code.tistory.com/19
- https://medium.com/@aloncohn8888/implementing-secure-iam-authentication-between-ecs-spring-boot-tasks-and-rds-1765a5115c03
'전공영역 공부 기록' 카테고리의 다른 글
| OIDC란? GitHub Actions 인증 사례로 알아보기 (0) | 2026.01.04 |
|---|---|
| OAuth프로토콜 (0) | 2026.01.01 |
| EKS ALB controller에서 gateway API 사용하는 방법 (0) | 2025.12.30 |
| Kubernetes Gateway API 간단히 알아보기 (2) | 2025.12.30 |
| eBPF와 함께하는 Cilium 핸즈온: Pod부터 Service 통신까지 (1) | 2025.12.27 |