Kafka 보안 설정을 보다 보면 가장 자주 마주치는 인증 방식이 있다.
바로 SASL/SCRAM 이다.
처음 보면 용어도 어렵고,
“비밀번호를 안 보낸다는데 그럼 어떻게 인증을 하지?”라는 의문이 든다.
이 글에서는
를 흐름 중심으로 정리해본다.
SASL (Simple Authentication and Security Layer)
SCRAM (Salted Challenge Response Authentication Mechanism)
즉,
SASL = 인증 틀
SCRAM = 그 안에서 동작하는 실제 인증 방식
Kafka에서는 보통 다음을 사용한다.
SCRAM-SHA-256SCRAM-SHA-512:contentReference[oaicite:0]{index=0} 는
사람이 로그인하는 시스템이 아니다.
Kafka 환경을 보면 보통 이런 구조다.
Producer → Broker ← Consumer
↑ ↑
Connect Stream App
특징은 다음과 같다.
Kafka가 인증 방식에 요구하는 조건은 대략 이렇다.
이 조건에 가장 잘 맞는 방식이 SCRAM이다.
SCRAM에서의 Client / Server는 역할 개념이다.
Kafka 기준으로 보면
이 정도가 되겠다.
아래는 Kafka Client가 Broker에 처음 연결할 때 일어나는 인증 흐름이다.
0단계: 사전 상태
사용자 생성 시점에 이미 다음 정보를 저장하고 있다.
비밀번호 원문은 저장하지 않는다.
username / password를 가지고 있음1단계: 인증 시작
Client → Server
username
clientNonce
2단계: 서버의 Challenge
Server → Client
salt
iterationCount
serverNonce (clientNonce 포함)
의미는 이렇다.
“이 salt와 반복 횟수로 계산해서
네가 진짜인지 증명해봐”
3단계: 클라이언트 내부 계산
이 단계는 네트워크로 전송되지 않는다.
클라이언트는 본인이 가진 비밀번호로 다음을 수행한다.
비밀번호를 알고 있는 쪽만 만들 수 있는 값이 생성된다.
4단계: 증명 제출
Client → Server
ClientProof
이 값은
5단계: 서버 검증 (핵심 로직)
서버는 클라이언트가 보낸 ClientProof를 그대로 믿지 않는다.
이미 서버는 검증에 필요한 기준값을 모두 가지고 있기 때문이다.
서버가 인증 시점에 가지고 있는 정보는 다음 세 가지다.
StoredKey AuthMessage ClientProof 서버는 이 값들을 이용해 다음 과정을 수행한다.
SCRAM에서 클라이언트는 ClientKey 자체를 보내지 않는다.
대신 ClientProof라는 값을 보낸다.
서버는 다음 연산을 통해 ClientKey를 역으로 복원한다.
ClientKey = ClientProof XOR hash(StoredKey + AuthMessage)
이 연산이 가능한 이유는 다음과 같다.
StoredKey를 이미 DB에 저장하고 있고AuthMessage 역시 서버와 클라이언트가 동일하게 알고 있기 때문이다즉, 비밀번호를 몰라도 ClientKey를 복원할 수 있는 조건이 이미 갖춰져 있다.
서버는 복원한 ClientKey를 다시 해시한다.
hash(ClientKey)
그리고 그 결과를 DB에 저장된 StoredKey와 비교한다.
hash(ClientKey) == StoredKey ?
ClientProof는 올바른 비밀번호로부터 생성되었다이 과정에서 서버는 비밀번호 원문을 한 번도 사용하지 않는다.
오직 이미 저장된 검증용 값(StoredKey)과
클라이언트가 제출한 증명값(ClientProof)만을 이용해 판단한다.
“이 증명값이 내가 알고 있는 StoredKey로부터 나올 수 있는 값인가?”
만 확인한다
6단계: 서버도 자기 자신을 증명
Server → Client
ServerSignature
클라이언트는 이를 검증해
7단계: 인증 완료
요청 → 도전 → 증명 → 검증
구조다
SCRAM은 다음 전제를 가진다.
“클라이언트가 비밀번호를 직접 알고 있다”
이 전제는
과는 잘 맞지 않는다.
SCRAM은
그래서 사람 로그인에는 OAuth/OIDC,
서버 간 인증에는 SCRAM이 주로 쓰인다.
Kafka에서 SCRAM은
사람이 로그인하는 인증이 아니라
프로세스가 프로세스를 신뢰하기 위한 인증 방식이다.
Kafka, DB, 내부 메시징 시스템에서
SCRAM이 오래 살아남는 이유도 여기에 있다.