CREATE TOKEN

CREATE TOKEN

현재 사용자를 위한 토큰을 만들어요. 서버가 무작위 비밀을 생성하고, 현재 사용자에게 추가 인증 방법으로 더한 뒤 쿼리 결과로 반환합니다. 비밀은 이 쿼리로만 표시됩니다 — 해시로 저장되므로 이후에 복구할 수 없어요.

출처: 문서

본문

Syntax:

CREATE TOKEN
    [{VALID UNTIL datetime | VALID FOR interval}]
    [GRANTS (privilege ON object [,...])]

이것은 ALTER USER <current user> ADD IDENTIFIED WITH sha256_password BY '<random secret>'의 축약형이며, 같은 VALID UNTILGRANTS 절을 가집니다. 따라서 토큰은 현재 사용자의 일반 비밀번호처럼 동작합니다:

  • 사용자에 묶여 있습니다 — system.query_logsystem.processes에서 사용자로 표시되고, 사용자가 삭제되면 동작을 멈추며, 사용자가 권한을 잃으면 접근 권한도 잃습니다.
  • VALID UNTIL 또는 VALID FOR로 시간을, GRANTS로 권한을 제한할 수 있습니다.
  • 비밀번호를 받는 모든 인증 메커니즘과 함께 사용할 수 있습니다(예: HTTP 인터페이스의 password 파라미터 또는 clickhouse-client--password 옵션).

토큰을 만들려면 CREATE TOKEN 권한 또는 현재 사용자에 대한 ALTER USER 권한이 필요합니다. 토큰은 그것이 속한 계정의 보안 수준을 낮추기 때문에 별도의 권한입니다. 하드웨어 키 또는 인증서로 인증된 사용자가 같은 계정에 대한 장기 비밀번호를 만드는 데 사용할 수 있기 때문이에요. 같은 권한이 동등한 ALTER USER <current user> ADD IDENTIFIED ... 문도 승인합니다.

Result

쿼리는 두 컬럼이 있는 한 행을 반환합니다:

Column Type Description
token String 생성된 비밀이에요.
valid_until DateTime64(0) 토큰이 만료되는 시각이에요. 0은 만료되지 않음을 의미하며, system.usersvalid_until 컬럼과 같은 인코딩입니다.

서식을 없이 비밀을 얻으려면 FORMAT TSVRaw로 선택하세요:

CREATE TOKEN VALID FOR INTERVAL 30 DAY GRANTS (SELECT ON db.*) FORMAT TSVRaw

비밀은 32자 길이이며 암호학적으로 안전한 무작위 소스에서 생성되므로 비밀번호 복잡도 규칙에 대해 검사할 필요가 없습니다(검사되지 않습니다) — 그 규칙은 사람이 선택하는 비밀번호를 제한하기 위해 존재합니다.

VALID UNTIL and VALID FOR Clauses

토큰의 수명을 제한해요. 그것들은 CREATE USER 인증 방법의 해당 절과 정확히 동일하게 동작합니다. VALID UNTIL은 절대 날짜와 시간을, VALID FOR는 쿼리가 실행될 때 현재 시간에 더해지는 interval을 받습니다.

두 절 없이 토큰은 create_token_default_ttl_seconds만큼 살아 있는데, 기본값은 30분입니다. 따라서 더 오래 살라고 요청하지 않은 토큰은 수명이 짧아요. 그 설정을 0으로 두거나 VALID UNTIL 'infinity'를 작성하면 만료되지 않는 토큰을 만들 수 있습니다.

Examples:

  • CREATE TOKEN VALID UNTIL '2026-12-31'
  • CREATE TOKEN VALID FOR INTERVAL 30 DAY
  • CREATE TOKEN VALID UNTIL 'infinity'

GRANTS Clause

토큰으로 인증된 세션의 접근 권한을 나열된 권한과의 교집합으로 제한해요. CREATE USER의 GRANTS 절과 정확히 동일하게 동작하며, 그 제한 사항도 포함합니다 — 특히 제한은 쿼리를 받는 노드에서 집행되고 클러스터의 다른 노드로 전파되지 않습니다. 이 절은 접근 권한을 추가하지 않습니다. 사용자에게 부여되지 않은 권한은 토큰에도 사용할 수 없습니다. 절 없이 토큰은 사용자의 전체 접근 권한을 가집니다.

Examples:

  • CREATE TOKEN GRANTS (SELECT ON db.table)
  • CREATE TOKEN VALID FOR INTERVAL 90 DAY GRANTS (SELECT ON db.table, INSERT ON db.table)

이 제한과 시간 제한 모두 토큰의 세션이 남기는 것에는 적용되지 않습니다 — Security considerations를 참고하세요.

Managing Tokens

토큰은 사용자의 인증 방법이므로, SHOW CREATE USER(VALID UNTILGRANTS 절과 함께, 비밀 없이) 및 system.users 테이블의 auth_type, auth_params, auth_grants 컬럼에 나열됩니다.

단일 토큰을 버리는 문은 없습니다. 사용자의 모든 토큰을 취소하려면 예: ALTER USER <name> IDENTIFIED WITH ...로 인증 방법을 교체하거나, ALTER USER <name> RESET AUTHENTICATION METHODS TO NEW를 사용해 가장 최근에 추가된 것만 유지하세요. 사용자가 한 번에 가질 수 있는 인증 방법 수는 max_authentication_methods_per_user 서버 설정으로 제한됩니다.

비밀은 쿼리 자체가 생성하고 저장하므로, 결과가 클라이언트에 도달하지 못하는 CREATE TOKEN — 행이 전송되는 동안 연결이 끊기거나, 클라이언트가 열 수 없는 INTO OUTFILE — 은 아무도 사용할 수 없고 그 한도에 여전히 포함되는 인증 방법을 남깁니다. 아무도 그런 비밀을 쥐고 있지 않습니다. 쿼리가 실행되는 동안만 존재하기 때문이에요. 실행 전에 거부된 쿼리 — 사용할 수 없는 형식을 지정하는 FORMAT 절이 있는 것을 포함 — 는 아무것도 추가하지 않습니다.

CREATE TOKENON CLUSTER 절을 지원하지 않습니다. 접근 엔티티가 로컬로 저장된 클러스터에서 토큰이 동작하게 하려면 복제된 접근 저장소를 사용하거나(동등한 ALTER USER ... ADD IDENTIFIED WITH sha256_hash 문으로) 모든 노드에서 쿼리를 실행하세요.

Security Considerations

VALID UNTILGRANTS는 토큰으로 인증하는 세션을 제한합니다. 그것들은 세션들이 남기는 것을 제한하지 않습니다:

  • 기한은 세션이 토큰으로 인증할 때 확인됩니다. 이미 열린 세션과 이미 실행 중인 쿼리는 토큰이 만료되어도 중단되지 않습니다.
  • 세션이 만드는 모든 것은 토큰보다 오래 살아 있고, 스스로 작업을 하는 객체는 계속 합니다. 갱신 가능 머티리얼라이즈드 뷰는 계속 refresh되고, Kafka, RabbitMQ, NATS 또는 S3Queue 같은 스트리밍 테이블 엔진에 연결된 머티리얼라이즈드 뷰는 계속 소비하고, LIFETIME을 가진 딕셔너리는 토큰이 만료된 후에도 오래 계속 다시 로드됩니다. 뷰는 이 작업을 자기의 DEFINER의 권한으로 수행하는데, 기본적으로 뷰를 만든 사용자입니다 — 사용자의 전체 권한이며, 토큰의 GRANTS 절이 남긴 권한이 아닙니다.

따라서 테이블, 뷰 또는 딕셔너리를 만들 수 있는 토큰은 실제로 두 제한을 모두 확장할 수 있습니다. 기한 이후에도 계속 실행되고 사용자의 권한으로 토큰 자체가 허용되지 않은 일을 하는 영구 작업을 남길 수 있기 때문이에요. 토큰에는 애플리케이션이 필요한 것만 부여하세요 — 보통 명명된 테이블에 대한 SELECTINSERT — 그리고 제한이 유지되어야 할 때 CREATE TABLE, CREATE VIEW, CREATE DICTIONARYACCESS MANAGEMENT 권한은 GRANTS 절에 두지 마세요.

GRANTS 절이 있는 토큰으로 인증한 세션은 토큰을 전혀 발행할 수 없습니다. 기존 사용자에 인증 방법을 추가하는 것이 그러한 세션에 거부되기 때문이에요. 새 인증 방법의 GRANTS 절은 로그인 시 사용자의 접근 권한과 교집합되고, 그 방법을 만든 세션의 것과는 교집합되지 않습니다. 그렇지 않으면 제한을 넓히는 방법이 될 것입니다.

더 알아보기 (Learn more)