백엔드 데이터 인프라 70편. Redis ACL — Redis 6+ 부터 도입된 사용자·권한 관리. default 사용자 위험성, +command·-command·+@category DSL, 키 패턴(`~prefix:*`)·채널 패턴(`&channel:*`), 운영 환경 표준 패턴까지 풀어쓴 학습 노트.
이 글은 백엔드 데이터 인프라 시리즈 130편 중 70편이에요. 69편 까지 Replication·Cluster·Sentinel 같은 가용성 영역을 잡았다면, 이번 70편은 보안의 첫 번째 — ACL (Access Control List). Redis 6+ 부터 도입된 세분화된 사용자 권한 관리예요.
Redis ACL이 어렵게 느껴지는 이유
Redis 5 이하에서는 requirepass 하나로 비밀번호만 맞으면 전부 통과였어요. 6 부터 도입된 ACL 은 사용자·명령·키·채널 단위로 권한을 쪼개서 제어해요. 표현이 풍부해진 만큼 학습 곡선이 있어요.
첫째, ACL DSL (Domain-Specific Language, 권한을 한 줄로 적는 문법) 이 알파벳 마법주문처럼 보여요. on +@read ~user:* ¬ifications:* >password 같은 한 줄에 모든 권한이 압축돼 있어서 의미가 한눈에 안 들어와요.
둘째, default 사용자의 위험성. 기본 설치 직후 default 사용자는 비밀번호 없이 모든 명령과 모든 키에 접근할 수 있어요. "왜 비밀번호 없이 접근되지?" 라는 의문이 보안 사고의 가장 흔한 입구예요.
셋째, 명령 category 표가 머리에 안 들어와 있으면 +@read·+@write·+@admin 같은 게 추상적으로 느껴져요. 표 한 장만 옆에 두면 금방 익숙해져요.
이 글에서는 ACL DSL 의 핵심 5가지 — 사용자·명령·키·채널·비밀번호 — 와 명령 카테고리 표, 그리고 운영 환경 최소 권한 패턴까지 짚어볼게요.
ACL DSL — 5가지 영역
on +@read +@write -flushall ~user:* ¬if:* >MyPassword123
| 구분자 | 의미 |
|---|---|
on / off |
사용자 활성/비활성 |
+ / - |
명령 허용/차단 |
+@<cat> / -@<cat> |
카테고리 단위 허용/차단 |
~ |
키 패턴 허용 (glob) |
& |
Pub/Sub 채널 패턴 |
> |
비밀번호 추가 |
< |
비밀번호 제거 |
nopass |
비밀번호 없음 (개발용) |
default 사용자 — 가장 큰 함정
> ACL LIST
1) "user default on nopass ~* &* +@all"
한 줄씩 풀어보면, on 은 활성 상태, nopass 는 비밀번호가 없다는 뜻이고, ~* 는 모든 키, &* 는 모든 채널, +@all 은 모든 명령에 접근할 수 있다는 의미예요. 결국 인증 없이 전 권한이 열려 있는 상태라서, 운영 환경에서 이대로 두면 안 돼요.
안전화 단계
# 1. default 에 비밀번호 추가
> ACL SETUSER default >strong-pass
# 또는 default 비활성화 + 별도 admin 사용자
> ACL SETUSER admin on >admin-strong-pass ~* &* +@all
> ACL SETUSER default off
# ACL 영구 저장 (redis.conf 에 aclfile 명시 필요)
> ACL SAVE
명령 카테고리
| 카테고리 | 포함 명령 예시 |
|---|---|
@read |
GET·HGET·SMEMBERS·ZRANGE 등 모든 읽기 |
@write |
SET·DEL·HSET·ZADD 등 모든 쓰기 |
@keyspace |
KEYS·SCAN·EXISTS·TYPE 등 |
@admin |
CONFIG·CLUSTER·SCRIPT·DEBUG 등 운영 명령 |
@dangerous |
FLUSHALL·FLUSHDB·KEYS·SHUTDOWN 등 위험 |
@fast |
O(1) 명령 (대부분 단순 GET·SET) |
@slow |
O(N) 또는 그 이상 명령 |
@connection |
AUTH·HELLO·SELECT 등 |
@pubsub |
SUBSCRIBE·PUBLISH 등 |
@scripting |
EVAL·EVALSHA·FUNCTION 등 |
@hash / @list / @set / @string / @sorted_set / @stream |
자료구조 별 |
카테고리는 다음처럼 조회해요.
> ACL CAT # 전체 카테고리
> ACL CAT read # @read 안 명령들
핵심 ACL 명령
ACL LIST — 현재 사용자 목록
> ACL LIST
1) "user default off nopass ..."
2) "user admin on #a1b2c3 ~* &* +@all"
3) "user reader on #d4e5f6 ~cached:* +@read"
ACL SETUSER — 사용자 생성·수정
> ACL SETUSER reader on >readpass +@read ~cached:* &updates:*
OK
SETUSER 는 기존 권한 위에 더해지는 cumulative 동작이에요. 권한을 깨끗하게 다시 잡고 싶으면 reset 옵션을 함께 줘요.
> ACL SETUSER reader reset on >readpass +@read ~cached:*
ACL WHOAMI — 현재 사용자
> ACL WHOAMI
"reader"
ACL GETUSER — 특정 사용자 상세
> ACL GETUSER reader
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "abc123..." # SHA256 해시
5) "commands"
6) "+@read"
7) "keys"
8) 1) "~cached:*"
ACL DELUSER — 사용자 삭제
> ACL DELUSER reader
(integer) 1
ACL SAVE / LOAD — 영구 저장
aclfile 을 설정해 두면 메모리와 파일 사이에서 사용자 정보를 옮길 수 있어요.
# redis.conf
aclfile /etc/redis/users.acl
> ACL SAVE # 메모리 → 파일
> ACL LOAD # 파일 → 메모리
키 패턴 (~) — 세분화된 키 권한
키 권한은 glob (와일드카드 매칭) 패턴으로 잡아요.
# 모든 키
> ACL SETUSER u1 ~*
# 특정 prefix
> ACL SETUSER u1 ~cached:*
# 여러 prefix
> ACL SETUSER u1 ~cached:* ~session:*
# 키 패턴 reset
> ACL SETUSER u1 resetkeys ~newprefix:*
Redis 7+ — 읽기/쓰기 분리
> ACL SETUSER u1 %R~public:* # public:* 키는 읽기만
> ACL SETUSER u1 %W~queue:* # queue:* 키는 쓰기만
%R 은 read-only, %W 는 write-only 라서 같은 키 prefix 에도 더 정교하게 권한을 나눌 수 있어요.
채널 패턴 (&) — Pub/Sub 권한
& 는 Pub/Sub (발행/구독 채널) 권한을 잡는 구분자예요.
> ACL SETUSER notifier on >pass +publish ¬ifications:*
# 인증 후
> AUTH notifier pass
> PUBLISH notifications:user42 "hello" # OK
> PUBLISH chat:room1 "hi" # ERR
운영 환경 — 표준 사용자 패턴
1. Admin (관리 전용)
> ACL SETUSER admin on >admin-strong-pass ~* &* +@all
모든 명령·키·채널에 접근하는 운영자 전용 사용자라서, 비밀번호를 강하게 잡고 사람만 써요.
2. App (애플리케이션 백엔드)
> ACL SETUSER app on >app-pass +@read +@write +@hash +@string +@list +@set +@sorted_set +@stream -flushall -flushdb -shutdown -debug -config ~app:* &events:*
데이터 자료구조와 Pub/Sub 일부만 열어 주고, FLUSHALL 같은 위험 명령은 차단해요. 키도 app:* prefix 안으로 묶고요.
3. Reader (읽기 전용)
> ACL SETUSER reader on >read-pass +@read ~* -@dangerous
읽기만 가능하고 위험 명령은 빠져 있어서, 분석·BI (Business Intelligence, 데이터 분석 도구) ·monitoring 도구에 붙이기 좋아요.
4. Cache (캐시 전용)
> ACL SETUSER cache on >cache-pass +get +set +setex +del +expire +ttl ~cached:*
쓰는 명령 집합도 매우 좁고 키도 cached:* prefix 안으로만 묶었어요. 최소 권한 원칙을 그대로 적용한 예시예요.
Spring Boot 통합
spring:
data:
redis:
username: app
password: app-pass
host: redis-host
port: 6379
Lettuce 와 Jedis (둘 다 Java 용 Redis 클라이언트) 가 자동으로 인증을 처리해요. ACL 이 없는 환경이면 username 은 빼고 password 만 (requirepass 모드) 잡으면 돼요.
한계·실무 함정
1. default 비밀번호 없음
기본 설치 직후에 외부로 노출되면 곧장 침해돼요. 최우선 작업은 default 비밀번호를 설정하거나 비활성으로 돌리는 거예요.
2. ACL 적용 안 됨 (aclfile 미설정)
ACL SETUSER 로 만든 사용자가 재시작하면 그대로 사라져요. aclfile 을 잡거나 redis.conf 의 user 지시문으로 영구 저장 경로를 명시해야 해요.
3. 권한 너무 풀어 줌
귀찮다고 모든 백엔드 사용자에게 +@all 을 쥐어 주면 ACL 을 쓰는 의미가 사라져요. 최소 권한 원칙으로 필요한 만큼만 열어 줘야 해요.
4. 권한 변경 후 연결 안 끊김
여기가 시험 함정 포인트예요. 이미 인증된 connection 은 SETUSER 로 권한을 바꿔도 기존 권한을 그대로 가지고 있어요. 즉시 적용하려면 해당 사용자의 모든 connection 을 강제로 끊어야 해요.
> CLIENT KILL USER reader
5. ACL 인증 실패 시 명령 차단
권한이 없는 명령을 부르면 NOPERM 에러가 떨어져요. 클라이언트가 retry loop 에 빠지지 않도록 에러 처리를 분명하게 잡아 둬야 해요.
시험 직전 한 번 더 — Redis ACL 함정 압축 노트
- ACL = Redis 6+ 부터 사용자·명령·키·채널 단위 권한 제어
default사용자 = 기본 nopass + 모든 권한 → 운영 환경 최우선 안전화- ACL DSL —
on/off·+/-·+@/-@·~·&·>/< >password= 비밀번호 추가,<password= 제거nopass= 비밀번호 없음 (개발용)- 명령 카테고리 —
@read·@write·@admin·@dangerous·@fast·@slow·@connection·@pubsub·@scripting - 자료구조 카테고리 —
@string·@hash·@list·@set·@sorted_set·@stream - 카테고리 조회 =
ACL CAT/ACL CAT <name> - 핵심 명령 =
ACL LIST·SETUSER·WHOAMI·GETUSER·DELUSER·SAVE·LOAD SETUSER= 권한 cumulative (기존에 추가) → 깨끗히는reset- 영구 저장 =
aclfile설정 +ACL SAVE - 키 패턴
~= glob 패턴 (~cached:*) - Redis 7+ =
%R~읽기 전용,%W~쓰기 전용 - 채널 패턴
&= Pub/Sub 채널 권한 - 표준 사용자 4가지 = Admin · App · Reader · Cache
- App 사용자 =
+@read +@write -flushall -flushdb -shutdown -debug -config - Cache 사용자 = 최소 명령만 (
+get +set +setex +del +expire) - 최소 권한 원칙 — 필요한 것만 허용
- Spring Boot 통합 =
spring.data.redis.username+password - 함정 —
default비밀번호 없음 = 즉시 침해 위험 - 함정 —
aclfile미설정 → 재시작 시 사용자 사라짐 - 함정 — 권한 변경 후 기존 connection 유지 →
CLIENT KILL USER로 강제 종료 - 함정 — 권한 없는 명령 =
NOPERM에러 → 클라이언트 에러 처리 필수
공식 문서: Redis ACL 에서 자세한 DSL 과 운영 가이드를 확인할 수 있어요.
시리즈 다른 편 (앞뒤 글 모음)
이전 글:
- 65편 — Secondary Indexing 패턴 (RDB 인덱스 모방)
- 66편 — Redis Persistence (RDB · AOF · Hybrid)
- 67편 — Redis Replication (Master-Replica)
- 68편 — Redis Cluster (Sharding · 16384 슬롯 · Hash Tag)
- 69편 — Redis Sentinel (자동 Failover · Quorum)
다음 글: