CREATE USER ... IDENTIFIED WITH jwt 문은 존재하지 않으며, 이를 시도하면 예외가 발생합니다. JWT 사용자는 토큰 수명 주기에 따라 전적으로 관리됩니다.
개요
- 클라이언트는 지원되는 전송 메커니즘 중 하나(HTTP
Authorization: Bearer헤더, TCP 네이티브 프로토콜, 또는 gRPCjwt필드)를 통해 서명된 JWT를 전달합니다. - ClickHouse가 토큰 서명을 검증합니다.
- 필수 클레임(
exp,iat,iss,sub,aud)을 검증합니다. clickhouse:grants및clickhouse:roles토큰 클레임에서 도출한 접근 권한에 권한 한도과의 교집합을 적용하여, 메모리 내에 임시 사용자를 생성합니다.- 토큰이 만료되면 백그라운드 가비지 컬렉션 작업이 해당 사용자를 제거합니다.
토큰 클레임
필수 클레임
JWKS 기반 키 해상도를 사용하는 경우
kid (key ID) 헤더 클레임도 필요합니다.
JWKS 모드는 RSA 키만 지원합니다정적 키 provider는
HS256, RS256, ES256을 모두 허용하지만, JWKS 기반 provider는 kty가 RSA인 JWK만 허용합니다(즉, RS256으로 서명된 토큰만 허용). HMAC(HS256) 또는 EC(ES256) 키로 서명된 토큰은 JWKS 엔드포인트를 기준으로 검증할 수 없으므로 거부됩니다.기타 인식되는 클레임
선택적 클레임
토큰 헤더와 페이로드 예시
임시 사용자의 동작 방식
아이덴티티 및 명명
iss, sub, aud 클레임에서 계산된 결정적 UUID를 받습니다. 이 UUID는 로그인할 때마다 변하지 않습니다. 서로 다른 토큰으로 여러 번 로그인하더라도 issuer, subject, audience가 같으면 항상 동일한 UUID를 받습니다.
하지만 사용자 이름은 유동적입니다. 다음과 같이 구성됩니다:
<claims_hash> 부분은 clickhouse:roles 또는 clickhouse:grants 클레임이 변경될 때마다 달라집니다. 즉, 동일한 아이덴티티라도 역할이나 권한 부여 집합이 다르면 서로 다른 사용자 이름이 생성됩니다.
접근 권한
permission_limit은 상한으로 설정된 기준 역할(role) 또는 사용자가 보유한 접근 권한의 집합입니다. 토큰이 요청한 권한 중 이 한도를 초과하는 권한은 별도의 알림 없이 삭제됩니다.
토큰 최신성
iat(issued-at) 클레임을 추적합니다. 저장된 값과 같거나 그보다 이전인 iat를 가진 토큰이 제시되면, 서버는 클레임을 다시 평가하지 않고 기존 임시 사용자를 재사용합니다. 이렇게 하면 오래된 토큰이 사용자 권한을 낮추는 일을 방지할 수 있습니다.
수명 및 가비지 컬렉션
valid_until(exp에서 파생됨)이 지나면 백그라운드 가비지 컬렉션 작업에 의해 제거됩니다. GC 인터벌은 gc_interval 매개변수(기본값: 5분)로 제어됩니다.
GC가 다시 실행되기 전까지는 만료된 사용자가 system.users에 계속 표시될 수 있지만, 더 이상 인증되지는 않습니다.
영구적인 액세스 할당
지정된 아이덴티티의 사용자 이름과 UUID는 사용자가 활성 상태일 때
system.users의 name 및 id 컬럼에서 확인할 수 있습니다.ALTER USER는 JWT 사용자에 대해 직접 사용할 수 없으며, 이들은 읽기 전용입니다. 설정 프로필, 쿼터 또는 정책을 할당하려면 위에 나온 것처럼 ALTER SETTINGS PROFILE, ALTER QUOTA 또는 ALTER ROW POLICY SQL 문을 사용하십시오.
일반 사용자와의 차이점
SQL SECURITY DEFINER 뷰
SQL SECURITY DEFINER로 뷰를 생성하면 서버는 해당 뷰의 정의자로 사용할 영구적인 섀도 사용자 복사본을 자동으로 생성합니다. 이 섀도 사용자는 다음과 같습니다.
- 이름은
<original_jwt_username>:definer입니다 NO_AUTHENTICATION상태입니다(로그인에는 사용할 수 없음)- 뷰가 생성된 시점에 원래 JWT 사용자가 갖고 있던 동일한 접근 권한을 유지합니다
클라이언트 사용 방법
토큰 직접 전달하기
clickhouse-client에서 --jwt 플래그를 사용하십시오:
--jwt 플래그는 --user와 함께 사용할 수 없습니다. --jwt를 지정하면 사용자 이름은 토큰에서 가져옵니다.HTTP 인터페이스
Authorization 헤더에 전송합니다:
OAuth2 디바이스 코드 로그인
clickhouse-client는 --login 플래그를 통해 대화형 OAuth2 디바이스 코드 인증 흐름을 지원합니다. ClickHouse Cloud endpoint의 경우, 클라이언트는 ClickHouse 전용 JWT를 얻기 위해 자동으로 토큰 교환을 수행합니다. 토큰은 세션 중 자동으로 갱신됩니다. 새 토큰을 받으면 클라이언트가 자동으로 재연결됩니다.
ClickHouse Cloud 내장 JWT 인증자
clickhouse-client --login 흐름에서 사용하는 사전 정의된 JWT 인증자가 기본으로 포함되어 있습니다. 이 인증자는 다음과 같이 구성됩니다.
내장 인증자의 권한 한도는
default_role 역할(role)과 default 사용자(user)로 설정됩니다. 즉, 모든 JWT 사용자의 유효 권한은 이 두 엔터티가 보유한 권한 부여와의 교집합으로 제한되므로, 토큰은 default_role 및 default에 허용된 범위를 넘어 권한을 상승시킬 수 없습니다.
이 인증자를 사용하기 위해 별도로 구성할 것은 없습니다. 서비스가 생성될 때 자동으로 프로비저닝됩니다.
서버 간 통신
문제 해결
- 접근 권한이 부여되지 않음: 참조된 역할 또는 사용자에게 필요한 권한 부여가 없을 수 있습니다.
clickhouse:roles에서 참조하는 역할이 실제로 존재하며, 적절한 권한 부여가 포함되어 있는지 확인하세요. - 토큰이 거부됨: 토큰의
iss,aud, 그리고 서명 알고리즘이 JWT 제공자가 기대하는 값과 일치하는지 확인하세요. JWKS를 사용하는 경우에는 토큰의kid가 제공자의 키 집합에 있는 키와 일치하는지도 확인하세요. - 쿼리 사이에 사용자가 사라짐: 임시 사용자는 토큰이 만료되면 제거됩니다. 장시간 유지되는 session에는 토큰 갱신을 지원하는 클라이언트(예:
--login모드)를 사용하세요. CREATE USER ... IDENTIFIED WITH jwt실패: 이는 정상적인 동작입니다. JWT 사용자는 DDL로 생성할 수 없습니다. 토큰 수명 주기에 따라 전적으로 관리됩니다.