26Z04c

Young-Kyoo Kim·2026년 8월 4일

MinIO Enterprise / AIStor 환경에서 LDAP / Keycloak 연동 시 Service Account(Access Key)를 대량 생성·삭제하는 모의 테스트(Benchmark)용 Bash 스크립트와 처리 소요 시간 가이드를 안내해 드립니다.


1. MinIO LDAP AccessKey 10개 생성 및 삭제 테스트 스크립트

mc CLI를 활용해 10개의 Access Key를 임의 생성하고, 이후 일괄 삭제하며 소요 시간을 측정(time)하는 스크립트입니다.

#!/bin/bash
# ==============================================================================
# MinIO LDAP Access Key Batch Benchmark Script
# ==============================================================================

ALIAS="myminio"
KEY_PREFIX="bench-ldap-key"
SECRET_KEY="TestSecretKey12345!"
COUNT=10

echo "=== [1/2] Generating $COUNT LDAP Access Keys ==="
start_gen=$(date +%s%N)

for i in $(seq -w 01 $COUNT); do
    ACCESS_KEY="${KEY_PREFIX}-${i}"
    # LDAP IDP 기반 Access Key 생성 (정책 할당 필요 시 --policy 추가)
    mc idp ldap accesskey add $ALIAS \
        --access-key "$ACCESS_KEY" \
        --secret-key "$SECRET_KEY" > /dev/null 2>&1
    
    if [ $? -eq 0 ]; then
        echo "[CREATED] $ACCESS_KEY"
    else
        echo "[FAILED] $ACCESS_KEY"
    fi
done

end_gen=$(date +%s%N)
gen_duration=$(( (end_gen - start_gen) / 1000000 ))
echo ">> Total Creation Time: ${gen_duration} ms ($(( gen_duration / COUNT )) ms/key)"

echo ""
echo "=== Waiting 3 seconds before removal ==="
sleep 3

echo ""
echo "=== [2/2] Deleting $COUNT LDAP Access Keys ==="
start_del=$(date +%s%N)

for i in $(seq -w 01 $COUNT); do
    ACCESS_KEY="${KEY_PREFIX}-${i}"
    # mc idp ldap accesskey rm ALIAS KEY
    mc idp ldap accesskey rm $ALIAS "$ACCESS_KEY" > /dev/null 2>&1
    
    if [ $? -eq 0 ]; then
        echo "[REMOVED] $ACCESS_KEY"
    else
        echo "[DELETE FAILED] $ACCESS_KEY"
    fi
done

end_del=$(date +%s%N)
del_duration=$(( (end_del - start_del) / 1000000 ))
echo ">> Total Deletion Time: ${del_duration} ms ($(( del_duration / COUNT )) ms/key)"

2. MinIO Access Key 삭제 시 예상 소요 시간 (10개 기준)

MinIO AIStor에서 mc idp ldap accesskey rm 명령어로 10개를 삭제하는 데 걸리는 시간은 약 0.5초 ~ 2초 (키당 50ms ~ 200ms) 내외입니다.

⏱️ 상세 소요 시간 영향 요소

  1. MinIO Metadata Consensus (Raft / IAM Index):
  • MinIO는 Access Key 상태 변경 시 내부 메타데이터(IAM)를 업데이트하고 노드 간 동기화를 수행합니다.
  • mc 명령어가 1회 실행될 때마다 HTTP REST API Call + 인증 + IAM 메타데이터 동기화 overhead가 발생하므로 건당 약 50~150ms가 소요됩니다.
  1. 병렬 처리 시:
  • 위의 for 문처럼 단일 세션(Sequential)으로 돌리면 10개 기준 약 1~2초입니다.
  • 만약 & (Background job)를 활용해 병렬 삭제(Parallel)를 수행하면 10개 전체 삭제에 200~500ms 이내로 끝납니다.

3. Keycloak JWT / Session / User-Consents 삭제 소요 시간

Keycloak에서 특정 User/Client에 발급된 JWT(Active User Sessions / Refresh Token / Offline Sessions) 10개를 무효화/삭제하는 경우, 어떤 방식으로 처리하느냐에 따라 소요 시간이 달라집니다.

① Keycloak Admin REST API를 이용한 Session / Token Revocation

Keycloak Admin API (DELETE /admin/realms/{realm}/users/{id}/sessions 또는 Revocation Endpoint)를 호출할 경우:

  • 10개 Session / Token 개별 Revoke:
  • API 호출 1회당 DB(PostgreSQL/Infinispan) 조회 및 세션 캐시 무효화 트랜잭션이 발생합니다.
  • API 1회 당 30ms ~ 80ms 소요 ➔ 10개 삭제 시 총 0.3초 ~ 1초 미만
  • User 단위 / Client 단위 Bulk Revoke (추천):
  • POST /admin/realms/{realm}/users/{id}/logout 또는 User Session 전체 삭제 호출 시 단 1회의 API Call(약 50ms~100ms)로 10개 이상의 세션이 즉시 모두 무효화됩니다.

💡 Keycloak Stateless JWT 참고사항:
Keycloak에서 발급한 Access Token(JWT)이 Stateless(자체 검증형)라면, Keycloak DB에서 세션을 삭제하더라도 토큰 자체의 Expiration Time(expexp)이 만료될 때까지는 Client 단에서 유효한 것으로 처리될 수 있습니다.
따라서 즉각적인 무효화가 목적이라면 1) Keycloak Admin API로 Logout/Session Kill을 수행하고, 2) MinIO 단에서 Access Key 삭제/IAM Sync를 맞춰주시는 방식이 가장 확실합니다.

==

7,000개 수준의 대규모 삭제 작업으로 넘어가면, 단순히 '10개 소요 시간 ×\times 7000' 형태의 선형 계산이 적용되지 않습니다. 네트워크 RTT(Round Trip Time), CLI 프로세스 생성 비용, DB/캐시 Lock 병목 등이 복합적으로 작용하기 때문입니다.

순차 처리(Sequential)와 병렬 처리(Parallel / Bulk API) 방식에 따라 소요 시간이 극명하게 차이 납니다.


1. MinIO LDAP AccessKey 7,000개 삭제 소요 시간

① 단일 루프 순차 처리 (Sequential mc 명령어)

  • 방식: for 문으로 mc idp ldap accesskey rm을 7,000번 반복 호출
  • 건당 소요 시간: 약 80ms ~ 150ms (mc binary execution + TLS Handshake + MinIO IAM Rest API + Cluster Sync)
  • 예상 소요 시간: 약 10분 ~ 18분

7,000건×0.1=70011.6\text{7,000건} \times 0.1\text{초} = 700\text{초} \approx 11.6\text{분}

⚠️ 주의: mc CLI를 매번 새로 띄우는 프로세스 Fork 비용이 상당하므로, 7,000건을 단일 스레드 mc 구문으로 돌리는 것은 권장하지 않습니다.

② 병렬 처리 (Parallel / xargs -P 활용)

  • 방식: Worker Thread를 16~32개로 동시 처리
  • 예상 소요 시간: 약 30초 ~ 1.5분
  • 한계/병목: MinIO 내부의 IAM Metadata Lock(KVS/Raft consensus) 업데이트 병목으로 인해 동시성을 너무 높이면(64+ 이상) HTTP 503 (Slow Down) 또는 Lock Timeout이 발생할 수 있으므로 Concurrency 16~32 정도가 적정 수준입니다.

2. Keycloak JWT / Session 7,000개 삭제 소요 시간

Keycloak에서 7,000개의 세션/토큰을 삭제(Revoke)할 때는 'API 호출 방식'에 따라 수십 분이 걸릴 수도, 단 수 초 만에 끝날 수도 있습니다.

① Admin REST API 개별/순차 호출 (DELETE /sessions/{id})

  • 건당 소요 시간: 약 30ms ~ 70ms (PostgreSQL/Infinispan DB I/O 발생)
  • 예상 소요 시간: 약 3.5분 ~ 8분

② User / Client / Realm 단위 Bulk Revoke API 활용 (권장)

  • 방식: 개별 세션을 7,000번 지우는 대신, 해당 사용자/클라이언트 레벨에서 Bulk Session Revocation API를 1~수회 호출
  • POST /admin/realms/{realm}/logout-all (Realm 전체 세션 무효화)
  • POST /admin/realms/{realm}/users/{user-id}/logout (특정 사용자의 전체 세션/JWT 무효화)
  • POST /admin/realms/{realm}/components/{id}/... (LDAP Provider 무효화)
  • 예상 소요 시간: 약 1초 ~ 5초 이내
    (Keycloak DB/Infinispan 캐시의 notBefore 타임스탬프만 업데이트하므로 7,000개가 단 몇 초 만에 일괄 무효화됩니다.)

3. 요약 및 비교표 (7,000개 기준)

대상처리 방식예상 소요 시간비고 / 추천 가이드
MinIO AccessKey순차 처리 (단일 for 루프)10분 ~ 18분권장하지 않음
MinIO AccessKey병렬 처리 (xargs -P 20)약 40초 ~ 1.5분강력 추천 (MinIO IAM 병목 고려 적정 Concurrency 유지)
Keycloak Session개별 API 7,000회 호출3.5분 ~ 8분DB I/O 부담 유발
Keycloak SessionBulk Revoke / Logout API1초 ~ 5초강력 추천 (notBefore timestamp 업데이트 방식)

💡 7,000개 병렬 삭제용 Bash 스크립트 팁 (xargs 활용)

MinIO AccessKey 7,000개를 고속으로 삭제해야 할 경우 아래와 같이 xargs의 병렬 옵션(-P)을 사용하는 것이 가장 효율적입니다.

# 7,000개의 키 목록 파일(keys.txt)을 작성 후 20개 동시 스레드로 삭제
cat keys.txt | xargs -P 20 -I {} mc idp ldap accesskey rm myminio "{}"

0개의 댓글