Valkey 9.1: DB별 ACL·Lua 모듈화·JSON 로그로 Redis 포크의 보안과 운영성을 강화한 방식
요약
Valkey는 2024년 Redis가 라이선스를 BSL로 전환한 이후 Linux Foundation 산하에서 Redis 7.x를 포크해 만들어진 오픈소스 프로젝트다. 2026년 7월 출시된 Valkey 9.1은 멀티테넌트 환경에서의 보안 격리, 운영 가시성, 성능 세 가지를 동시에 개선했다.
- DB별 ACL:
ACL SETUSER명령에db N한정자를 추가해 특정 유저를 특정 논리 DB에 고정한다. Redis와 기존 Valkey에는 없던 기능이다. - Lua 모듈 분리: Lua 스크립팅 엔진을 별도 컴파일 모듈로 분리했다. 스크립트를 사용하지 않는 배포에서 완전히 비활성화해 공격 표면을 줄인다.
- JSON 로그 포맷:
log-format json설정 한 줄로 구조화 로그를 활성화한다. CloudWatch, Datadog, Loki 파이프라인이 파싱 없이 바로 수집한다. - TLS 개선:
INFO tls에 인증서 만료일 필드 추가, 무중단 인증서 교체(자동 리로드), SAN URI mTLS 지원. - 메모리·처리량: 소형 문자열 최대 20% 메모리 절감, 정렬 집합(sorted set) 약 10% 절감, I/O 스레딩 최적화로 처리량 최대 17% 향상. CVE-2026-56684·CVE-2026-63639 보안 패치는 9.1.1에 포함됐다.
Amazon ElastiCache for Valkey가 9.1을 GA로 지원하면서 AWS 환경 마이그레이션 경로도 명확해졌다.
배경: Valkey는 왜 Redis 포크가 되었는가
2024년 3월 Redis Ltd.는 Redis 7.4부터 Server Side Public License(SSPL)와 Redis Source Available License(RSALv2)로 라이선스를 변경했다. 클라우드 벤더가 Redis를 서비스로 제공하려면 별도 계약이 필요해졌다. AWS, Google, Oracle 등이 Linux Foundation 산하에 Valkey를 포크로 만들었다.
Valkey는 Redis API와 프로토콜을 완전히 호환하면서 BSD-3 라이선스를 유지한다. 기존 Redis 클라이언트, 드라이버, 마이그레이션 도구가 변경 없이 작동한다.
핵심 기능 1: DB별 ACL
문제
Redis의 논리 DB(SELECT 0~15)는 멀티테넌트 키 분리에 자주 쓰인다. 그러나 기존 ACL은 DB 단위 격리를 지원하지 않았다. 유저에게 특정 키 패턴 접근을 허용해도 다른 DB의 동일 패턴 키까지 접근할 수 있었다.
해결
ACL SETUSER tenant_a on >password ~app:* &* +@all db 0
ACL SETUSER tenant_b on >password ~app:* &* +@all db 1db N 한정자가 추가됐다. tenant_a는 SELECT 0 이외의 DB에 명령을 보내면 NOPERM 오류를 받는다. db *는 전체 DB를 허용하며 기존 동작과 동일하다.
SELECT 0 → OK
SELECT 1 → OK
db 0: tenant_a 허용
tenant_a → DB 1 차단
tenant_a 전용
tenant_b 전용
이 기능은 단일 Valkey 인스턴스에서 팀·서비스별 키 공간을 엄격하게 분리해야 하는 경우 별도 인스턴스 없이 멀티테넌트를 구현하는 데 쓸 수 있다.
핵심 기능 2: Lua 모듈 분리
배경
Redis의 EVAL·EVALSHA·FUNCTION 명령은 서버 프로세스에 내장된 Lua 5.1 엔진을 실행한다. Lua는 강력하지만 RCE 시도의 진입점이 될 수 있다.
Valkey 9.1은 Lua 엔진을 분리 가능한 컴파일 모듈로 추출했다. valkey.conf에서:
# Lua 완전 비활성화
lua-enabled nolua-enabled no를 설정하면 EVAL 계열 명령이 ERR Lua scripting is disabled 오류를 반환한다. 인스턴스 재시작 없이도 배포 중에 변경 가능하다(CONFIG SET lua-enabled no).
Lua를 사용하는 배포는 기존과 동일하게 동작한다. 변경은 순수 opt-out이다.
핵심 기능 3: JSON 로그 포맷
기존 Valkey(Redis 계열) 로그는 비구조화 텍스트였다.
1234:M 08 Jul 2026 10:23:45.123 * Ready to accept connections tcp9.1 이후:
log-format json설정 시 출력:
{"timestamp":"2026-07-08T10:23:45.123Z","pid":1234,"role":"M","level":"notice","message":"Ready to accept connections tcp"}level 필드값은 debug, verbose, notice, warning으로 통일됐다. CloudWatch Logs Insights, Datadog Log Management, Grafana Loki 등은 JSON 파싱 룰 추가 없이 바로 쿼리할 수 있다.
핵심 기능 4: TLS 운영성 개선
인증서 만료 모니터링
INFO tls출력에 tls_cert_not_after_seconds 필드가 추가됐다. 현재 시각 기준 인증서 만료까지 남은 초 수다. Prometheus exporter에서 이 필드를 scrape하면 만료 알람을 별도 사이드카 없이 구성할 수 있다.
무중단 인증서 교체
tls-cert-file 경로를 제자리에서 교체한 뒤 CONFIG SET tls-reloadcert yes를 전송하면 기존 TLS 세션을 유지한 채 새 인증서를 로드한다. Let's Encrypt certbot 갱신 훅에 이 명령을 추가하면 롤링 재시작 없이 갱신이 완료된다.
SAN URI mTLS
tls-client-cert-uri-san에 URI SAN 패턴을 지정하면 클라이언트 인증서의 URI SAN 필드를 mTLS 인증에 사용한다. SPIFFE/SPIRE 환경에서 서비스 아이덴티티를 Valkey 접근 제어와 연계하는 데 활용한다.
성능: 메모리와 처리량
| 항목 | 개선폭 | 조건 |
|---|---|---|
| 소형 문자열 메모리 | 최대 -20% | 64바이트 이하 값이 많은 워크로드 |
| 정렬 집합(sorted set) 메모리 | 약 -10% | listpack 인코딩 조건 내 집합 |
| I/O 스레딩 처리량 | 최대 +17% | io-threads 2 이상 설정 시 |
소형 문자열 절감은 내부 embstr 인코딩 경계 상향과 메타데이터 헤더 압축으로 달성했다. 정렬 집합 절감은 listpack 엔트리 직렬화 개선에서 나왔다.
I/O 스레딩은 기존에도 있었지만 스레드 간 핸드오프 오버헤드가 커서 실질 이득이 작았다. 9.1은 파이프라인 batching을 개선해 실측 처리량이 올라갔다.
보안 패치: CVE-2026-56684·CVE-2026-63639
9.1.1 패치 릴리스(2026년 7월 말)에 두 CVE가 포함됐다.
- CVE-2026-56684: LMPOP 커맨드 처리 중 발생하는 힙 오버플로우. 특수하게 조작된 LMPOP 페이로드가 서버 크래시 또는 원격 코드 실행으로 이어질 수 있다. CVSS 8.8 (Critical).
- CVE-2026-63639: AUTH 핸들러 타이밍 사이드채널. 패스워드 길이를 Oracle 공격으로 추측할 수 있다. CVSS 5.3 (Medium).
9.0.x 브랜치는 9.0.5 패치에 동일 수정이 백포트됐다. 두 CVE 모두 인터넷에 직접 노출된 Valkey 인스턴스에 해당되므로, 방화벽 뒤 내부 배포는 위험도가 낮다.
Redis에서 Valkey 9.1로 마이그레이션
Valkey는 Redis 7.x와 RESP3 프로토콜·명령 세트가 호환된다. 다음 절차로 무중단 전환이 가능하다.
- 클러스터 롤링 업그레이드: 레플리카를 먼저 Valkey 9.1로 교체 → 페일오버 → 구 프라이머리 교체.
- 클라이언트 드라이버: 변경 없이 재사용 가능. Jedis, ioredis, redis-py, go-redis 모두 Valkey에서 정상 동작.
valkey-cli제공:redis-cli의 드롭인 대체. 기존 스크립트에서 호출 경로만 변경.- 모듈 호환성: Redis 모듈 API를 Valkey가 유지하므로 대부분의 서드파티 모듈이 재컴파일 없이 로드된다. 단, Lua 모듈 분리로
lua-enabled no상태에서는 EVAL 의존 모듈이 동작하지 않는다.
운영 체크리스트
- [ ]
valkey-server --version으로 9.1.1 이상 확인 — CVE 두 건 모두 9.1.1 포함 버전에서 패치됨 - [ ] 멀티테넌트 운영 시
ACL SETUSER … db N적용 후ACL WHOAMI,DEBUG SLEEP으로 크로스-DB 접근 차단 검증 - [ ] Lua 미사용 배포에
lua-enabled no추가 —CONFIG SET lua-enabled no로 무중단 적용 가능 - [ ]
log-format json전환 후 기존 텍스트 파서 비활성화, JSON 파이프라인(CloudWatch/Loki) 확인 - [ ]
INFO tls | grep tls_cert_not_after_seconds결과를 Prometheus로 scrape해 만료 30일 전 알람 설정 - [ ]
io-threads설정이 1 이상이면 처리량 벤치마크로 +17% 개선 여부 확인 (워크로드 패턴에 따라 다름) - [ ] Amazon ElastiCache for Valkey 9.1 GA 이후 AWS 마이그레이션 플랜 검토
요점 정리
- Valkey 9.1은 Redis 포크 프로젝트로, BSD-3 라이선스를 유지하며 Redis 7.x와 완전히 호환된다.
ACL SETUSER … db N으로 DB별 유저 격리가 가능해졌다. 기존 Redis·Valkey에 없던 기능이다.- Lua 엔진을 분리 모듈로 추출해
lua-enabled no로 완전 비활성화할 수 있다. 공격 표면 최소화에 유효하다. log-format json한 줄로 구조화 로그를 활성화한다. CloudWatch·Datadog·Loki에서 파싱 없이 수집 가능하다.- TLS 인증서 만료 모니터링(
INFO tls), 무중단 교체, SAN URI mTLS를 지원한다. - 소형 문자열 메모리 최대 20% 절감, I/O 스레딩 처리량 최대 17% 향상. CVE-2026-56684(CVSS 8.8)·CVE-2026-63639는 9.1.1에서 패치됐다.
References
- Valkey 9.1 릴리스 노트: https://github.com/valkey-io/valkey/releases/tag/9.1.0
- Valkey 9.1.1 보안 패치: https://github.com/valkey-io/valkey/releases/tag/9.1.1
- Valkey ACL 문서: https://valkey.io/docs/topics/acl/
- Amazon ElastiCache for Valkey: https://aws.amazon.com/elasticache/valkey/
- Linux Foundation Valkey 프로젝트: https://valkey.io/