백엔드 데이터 인프라 70편 — Redis ACL (사용자·권한 관리)

2026-05-17백엔드 데이터 인프라

백엔드 데이터 인프라 70편. Redis ACL — Redis 6+ 부터 도입된 사용자·권한 관리. default 사용자 위험성, +command·-command·+@category DSL, 키 패턴(`~prefix:*`)·채널 패턴(`&channel:*`), 운영 환경 표준 패턴까지 풀어쓴 학습 노트.

📚 백엔드 데이터 인프라 · 70편 — Redis ACL (사용자·권한 관리)

이 글은 백엔드 데이터 인프라 시리즈 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:* &notifications:* >password 같은 한 줄에 모든 권한이 압축돼 있어서 의미가 한눈에 안 들어와요.

둘째, default 사용자의 위험성. 기본 설치 직후 default 사용자는 비밀번호 없이 모든 명령과 모든 키에 접근할 수 있어요. "왜 비밀번호 없이 접근되지?" 라는 의문이 보안 사고의 가장 흔한 입구예요.

셋째, 명령 category 표가 머리에 안 들어와 있으면 +@read·+@write·+@admin 같은 게 추상적으로 느껴져요. 표 한 장만 옆에 두면 금방 익숙해져요.

이 글에서는 ACL DSL 의 핵심 5가지 — 사용자·명령·키·채널·비밀번호 — 와 명령 카테고리 표, 그리고 운영 환경 최소 권한 패턴까지 짚어볼게요.

ACL DSL — 5가지 영역

on  +@read +@write -flushall  ~user:*  &notif:*  >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 &notifications:*

# 인증 후
> 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.confuser 지시문으로 영구 저장 경로를 명시해야 해요.

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 과 운영 가이드를 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!