TokenAuthenticatable concern 사용하기
GitLab v19.1TokenAuthenticatable 모듈은 ActiveRecord 모델에 토큰 기반 인증 기능을 제공하는 concern입니다. 이 모듈은 모델에 토큰 기반 인증을 추가하는 유연한 방법을 제공합니다. digest: 토큰의 SHA256 다이제스트를 데이터베이스에 저장합니다.
TokenAuthenticatable 모듈은 ActiveRecord 모델에 토큰 기반 인증 기능을 제공하는 concern입니다.
이 모듈을 사용하면 모델에 인증 토큰을 정의할 수 있습니다.
개요#
이 모듈은 모델에 토큰 기반 인증을 추가하는 유연한 방법을 제공합니다.
세 가지 저장 전략을 지원합니다:
-
digest: 토큰의SHA256다이제스트를 데이터베이스에 저장합니다. -
encrypted: AES 256 GCM 알고리즘을 사용하여 토큰을 암호화한 후 데이터베이스에 저장합니다. -
insecure: 토큰을 암호화하거나 다이제스트하지 않고 그대로 데이터베이스에 저장합니다. 이 전략의 사용을 강력히 권장하지 않습니다.
각 저장 전략에 대한 여러 옵션도 지원합니다.
사용법#
모델에서 token_field 속성을 정의하려면 모듈을 include하고 add_authentication_token_field를 호출하세요:
class User < ApplicationRecord
include TokenAuthenticatable
add_authentication_token_field :token_field, encrypted: :required,
routable_token : { ... }
end
저장 전략#
-
encrypted: :required: 암호화된 토큰을token_field_encrypted칼럼에 저장합니다.token_field_encrypted칼럼이 존재해야 합니다. 이 전략의 사용을 강력히 권장합니다. -
encrypted: :migrating: 암호화된 토큰과 평문 토큰을 각각token_field_encrypted와token_field에 저장합니다. 항상 평문 토큰을 읽습니다. 속성을 암호화로 전환하는 과정에서 사용해야 합니다.token_field와token_field_encrypted칼럼 모두 존재해야 합니다. -
encrypted: :optional: 암호화된 토큰을token_field_encrypted칼럼에 저장합니다.token_field_encrypted에서 먼저 읽고, 없으면token_field로 폴백합니다. 암호화된 토큰을 쓸 때token_field칼럼의 평문 토큰을 null로 만듭니다.token_field와token_field_encrypted칼럼 모두 존재해야 합니다. -
digest: true: 토큰의 다이제스트를 데이터베이스에 저장합니다.token_field_digest칼럼이 존재해야 합니다. -
insecure: true: 토큰을 암호화하거나 다이제스트하지 않고 그대로 데이터베이스에 저장합니다. 이 전략의 사용을 강력히 권장하지 않습니다.
기본적으로 저장 전략을 선택하지 않으면 토큰의 SHA256 다이제스트가 데이터베이스에 저장됩니다.
token_field_encrypted 칼럼은 항상 인덱싱되어야 합니다. 토큰의 고유성 검사 및 조회에 사용되기 때문입니다.
라우터블 토큰#
routable_token 옵션을 사용하면 라우팅 정보를 토큰에 직접 인코딩할 수 있습니다.
이를 통해 시스템이 추가적인 데이터베이스 조회 없이 올바른 셀 또는 샤드로 요청을 라우팅할 수 있습니다.
라우터블 토큰은 Routable Tokens 설계 문서를 따릅니다.
routable_token: 옵션을 다음 항목을 포함한 해시로 정의하세요:
-
if:: 토큰 소유자 레코드를 받는 proc입니다. 이 proc은 일반적으로 기능 플래그 확인이나 기타 조건을 포함합니다. proc이false를 반환하면Devise.friendly_token을 사용하여 무작위 토큰이 생성됩니다. -
payload:: 토큰에 인코딩할 라우팅 정보를 정의하는{ key => proc }해시입니다. 각 proc은 토큰 소유자 레코드를 받아 해당 키의 값을 반환합니다. 최종 페이로드에는 Cell ID(c) 또는 Organization ID(o) 중 하나 이상이 반드시 포함되어야 합니다. 지원하는 키는 다음과 같습니다:
c: Cell ID (Gitlab.config.cell.id가 설정된 경우 기본적으로 포함됨)
-
o: Organization ID -
g: Group ID -
p: Project ID -
u: User ID -
t: 러너 유형 (예: 인스턴스 유형은t:1, 그룹 유형은t:2, 프로젝트 유형은t:3)
예시는 Routable Tokens 설계 문서를 참조하세요.
기타 옵션#
-
unique: false: 토큰 고유성을 강제하지 않으며find_by_token_field(token_field는 속성 이름) 생성을 비활성화합니다. 기본값은true입니다. -
format_with_prefix: :compute_token_prefix: 토큰에 접두사를 정의할 수 있습니다.#compute_token_prefix메서드는String을 반환해야 합니다. 기본값은 접두사 없음입니다. 토큰 접두사에 대한 가이드를 참조하세요. -
expires_at: :compute_token_expiration_time: 토큰이 만료되어야 하는 시간을 정의할 수 있습니다.#compute_token_expiration_time메서드는Time객체를 반환해야 합니다. 기본값은 만료 없음입니다. -
token_generator:토큰을 반환하는 proc입니다. 없으면Devise.friendly_token을 사용하여 무작위 토큰이 생성됩니다. -
require_prefix_for_validation:(:encrypted전략 전용): 토큰 접두사가 예상 접두사와 일치하는지 확인합니다. 접두사가 일치하지 않으면 토큰이 설정되지 않은 것처럼 동작합니다. 기본값은false입니다.
토큰 접근 및 조작#
user = User.new
user.token_field # Retrieves the token
user.set_token_field('new_token') # Sets a new token
user.ensure_token_field # Generates a token if not present
user.ensure_token_field! # Generates a token if not present
user.reset_token_field! # Resets the token and saves the model with #save!
user.token_field_matches?(other_token) # Securely compares the token with another
user.token_field_expires_at # Returns the expiration time
user.token_field_expired? # Checks if the token has expired
user.token_field_with_expiration # Returns a API::Support::TokenWithExpiration object, useful for API response