Redis를 운영하다 보면 가장 당황스러운 순간 중 하나가 바로 ‘WRONGPASS Invalid username-password pair’ 에러를 마주할 때입니다. 분명히 올바른 비밀번호를 입력했는데도 계속 인증이 실패한다면, 이는 단순한 비밀번호 오타가 아닐 가능성이 높습니다.
실제로 최근 Redis 6.0 이상 버전을 사용하는 개발자들 사이에서 이 문제가 빈번하게 발생하고 있으며, 특히 기존 버전에서 업그레이드한 환경에서 더욱 자주 나타나고 있습니다. 이 글에서는 이런 답답한 상황을 완전히 해결할 수 있는 실용적인 방법들을 단계별로 살펴보겠습니다.
1. 문제의 핵심: Redis 6.0 ACL 시스템 변화
Redis 6.0부터 도입된 ACL(Access Control List) 시스템이 이 문제의 주요 원인입니다. 기존의 단순한 requirepass
방식에서 사용자 기반의 세분화된 권한 관리 시스템으로 변경되면서, 인증 방식도 함께 바뀌었습니다.
기존 방식 vs 새로운 방식
# Redis 5.x 이하 (기존 방식)
AUTH password123
# Redis 6.0+ (새로운 방식)
AUTH username password123
# 또는
AUTH default password123
Redis 6.0에서는 커넥션을 맺은 뒤 유저의 이름과 패스워드를 인증하는 방식으로 작동하며, 기본 유저는 명시적으로 인증되지 않았지만 기능의 일부분을 사용할 수 있다는 특성을 가지고 있습니다.
2. 주요 원인별 해결 방법
2-1. 연결 URL 형식 오류
가장 흔한 실수 중 하나는 연결 URL에서 콜론(:
) 사용법을 잘못 이해하는 것입니다.
잘못된 예시:
// ❌ 잘못된 형식
redis://:username:password@host:port/db
// ❌ 사용자명 앞에 불필요한 콜론
redis://:default:123456@localhost:6379/0
올바른 예시:
// ✅ 올바른 형식 (사용자명과 비밀번호 모두 있는 경우)
redis://username:password@host:port/db
// ✅ 비밀번호만 있는 경우 (기본 사용자)
redis://:password@host:port/db
// ✅ 구체적인 예시
redis://myuser:mypassword@localhost:6379/0
redis://:secretpass@localhost:6379/0
연결 URL에서 사용자명 앞의 콜론이 문제가 되는 경우가 많으며, 비밀번호만 있고 사용자명이 없는 경우에만 앞에 콜론을 사용해야 합니다.
2-2. 기본 사용자(default) 설정 확인
Redis 6.0+에서는 default
사용자가 자동으로 생성됩니다. 현재 사용자 설정을 확인해보세요:
# Redis CLI에서 현재 사용자 목록 확인
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* +@all"
# 특정 사용자 정보 확인
127.0.0.1:6379> ACL GETUSER default
만약 기본 사용자가 비활성화되어 있다면:
# 기본 사용자 활성화
127.0.0.1:6379> ACL SETUSER default on
# 기본 사용자에 비밀번호 설정
127.0.0.1:6379> ACL SETUSER default >yourpassword
2-3. 클라우드 서비스별 특별 설정
AWS ElastiCache
AWS ElastiCache에서 IAM 인증을 사용하는 경우, 사용자 ID와 사용자명이 동일하고 소문자여야 하며, 임시 보안 자격 증명을 비밀번호로 사용해야 합니다.
# ElastiCache IAM 인증 예시
redis-cli -h your-cluster.cache.amazonaws.com -p 6379 --tls \
--user your-iam-user-id \
--askpass
Azure Cache for Redis
# Azure에서 사용자명:비밀번호 형식 사용
redis-cli -h your-cache.redis.cache.windows.net -p 6380 --tls \
-a "username:password"
3. 프로그래밍 언어별 해결 방법
3-1. Node.js (node-redis)
Node.js의 redis 클라이언트에서 3.1.0 버전 이후 인증 방식이 변경되어 기존 방식으로는 WRONGPASS 에러가 발생할 수 있습니다.
// ❌ 문제가 있는 코드 (구버전 방식)
const redis = require('redis');
const client = redis.createClient({
host: 'localhost',
port: 6379,
password: 'yourpassword'
});
// ✅ 해결된 코드 (최신 방식)
const redis = require('redis');
const client = redis.createClient({
url: 'redis://:yourpassword@localhost:6379',
// 또는 사용자명이 있는 경우
// url: 'redis://username:password@localhost:6379'
});
// ✅ 또는 명시적 인증 방식
const client = redis.createClient({
socket: {
host: 'localhost',
port: 6379
},
username: 'default', // 또는 실제 사용자명
password: 'yourpassword'
});
3-2. Python (redis-py)
import redis
# ✅ 올바른 연결 방법
# 방법 1: URL 방식
r = redis.from_url('redis://:password@localhost:6379/0')
# 방법 2: 매개변수 방식
r = redis.Redis(
host='localhost',
port=6379,
username='default', # Redis 6.0+에서는 명시적으로 지정
password='yourpassword',
db=0
)
# 방법 3: 사용자명이 있는 경우
r = redis.Redis(
host='localhost',
port=6379,
username='myuser',
password='mypassword',
db=0
)
3-3. Java (Jedis)
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
// ✅ 올바른 연결 방법
public class RedisConnection {
private JedisPool jedisPool;
public void initializePool() {
JedisPoolConfig config = new JedisPoolConfig();
// Redis 6.0+ ACL 사용자 인증
jedisPool = new JedisPool(config, "localhost", 6379,
2000, "default", "yourpassword");
// 또는 사용자명이 있는 경우
// jedisPool = new JedisPool(config, "localhost", 6379,
// 2000, "username", "password");
}
}
4. 실시간 디버깅 및 진단 방법
4-1. 연결 상태 실시간 모니터링
# Redis 서버에서 실시간 명령 모니터링
127.0.0.1:6379> MONITOR
# 클라이언트 연결 정보 확인
127.0.0.1:6379> CLIENT LIST
# 현재 인증된 사용자 확인
127.0.0.1:6379> ACL WHOAMI
4-2. 단계별 문제 진단
1단계: 기본 연결 테스트
# 기본 연결 (비밀번호 없음)
redis-cli -h localhost -p 6379
127.0.0.1:6379> PING
2단계: 사용자명 없이 비밀번호만으로 인증
redis-cli -h localhost -p 6379
127.0.0.1:6379> AUTH yourpassword
3단계: 사용자명과 비밀번호로 인증
redis-cli -h localhost -p 6379
127.0.0.1:6379> AUTH default yourpassword
# 또는
127.0.0.1:6379> AUTH username password
4-3. 로그 분석
Redis 서버 로그에서 인증 관련 메시지를 확인하세요:
# Redis 로그 실시간 확인
tail -f /var/log/redis/redis-server.log
# 또는 Docker 환경에서
docker logs -f your-redis-container
5. 자주 발생하는 오류 시나리오와 해결책
시나리오 1: Docker 환경에서의 문제
# docker-compose.yml 올바른 설정
version: '3.8'
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
environment:
- REDIS_PASSWORD=yourpassword
command: >
--requirepass yourpassword
--user default on >yourpassword ~* +@all
시나리오 2: 버전 업그레이드 후 문제
# 기존 Redis 5.x에서 6.0+로 업그레이드 시
# 1. 기존 requirepass 설정 확인
127.0.0.1:6379> CONFIG GET requirepass
# 2. ACL로 마이그레이션
127.0.0.1:6379> ACL SETUSER default on >현재비밀번호 ~* +@all
# 3. 설정 저장
127.0.0.1:6379> CONFIG REWRITE
시나리오 3: 클라이언트 라이브러리 호환성 문제
언어 | 라이브러리 | 최소 권장 버전 | 참고사항 |
---|---|---|---|
Node.js | node-redis | 4.0.0+ | 3.1.0 이하에서 ACL 문제 있음 |
Python | redis-py | 3.5.0+ | username 매개변수 지원 |
Java | Jedis | 3.6.0+ | ACL 사용자 인증 지원 |
Go | go-redis | 8.0.0+ | Redis 6.0 ACL 완전 지원 |
6. 마지막으로 간단히 정리하자면…
다음 체크리스트를 순서대로 확인해보세요:
✅ 기본 확인사항
- [ ] Redis 버전이 6.0 이상인지 확인
- [ ] 연결 URL 형식이 올바른지 확인 (
redis://username:password@host:port/db
) - [ ] 클라이언트 라이브러리 버전이 최신인지 확인
✅ 인증 방식 확인
- [ ]
AUTH username password
형식으로 인증 시도 - [ ] 기본 사용자(
default
) 상태 확인 - [ ] ACL 사용자 목록 및 권한 확인
✅ 환경별 특수사항
- [ ] 클라우드 서비스별 특별 인증 방식 확인 (AWS IAM, Azure AD 등)
- [ ] Docker/Kubernetes 환경에서의 네트워크 설정 확인
- [ ] SSL/TLS 설정이 필요한지 확인
✅ 로그 및 모니터링
- [ ] Redis 서버 로그에서 인증 관련 에러 메시지 확인
- [ ]
MONITOR
명령으로 실시간 명령 추적 - [ ] 클라이언트 연결 상태 확인