TypeScript

Better Auth는 타입 안전하도록 설계되었습니다. 클라이언트와 서버 모두 TypeScript로 구축되어 타입을 쉽게 추론할 수 있습니다.

TypeScript 설정

Strict 모드

Better Auth는 TypeScript의 strict 모드와 함께 작동하도록 설계되었습니다. TypeScript 설정 파일에서 strict 모드를 활성화하는 것을 권장합니다:

tsconfig.json
{
  "compilerOptions": {
    "strict": true
  }
}

stricttrue로 설정할 수 없는 경우, strictNullChecks를 활성화할 수 있습니다:

tsconfig.json
{
  "compilerOptions": {
    "strictNullChecks": true,
  }
}

컴파일러가 직렬화할 최대 길이를 초과하는 TypeScript 추론 문제가 발생하는 경우, 위의 지침을 따르고 있는지 확인하고, declarationcomposite가 모두 활성화되어 있지 않은지 확인하세요.

타입 추론하기

클라이언트 SDK와 서버 모두 $Infer 속성을 사용하여 추론할 수 있는 타입을 제공합니다. 플러그인은 UserSession 같은 기본 타입을 확장할 수 있으며, $Infer를 사용하여 이러한 타입을 추론할 수 있습니다. 또한 플러그인은 $Infer를 통해 추론할 수 있는 추가 타입을 제공할 수 있습니다.

auth-client.ts
import { createAuthClient } from "better-auth/client"

const authClient = createAuthClient()

export type Session = typeof authClient.$Infer.Session

Session 타입은 sessionuser 속성을 모두 포함합니다. user 속성은 user 객체 타입을 나타내고, session 속성은 session 객체 타입을 나타냅니다.

서버 측에서도 타입을 추론할 수 있습니다.

auth.ts
import { betterAuth } from "better-auth"
import Database from "better-sqlite3"

export const auth = betterAuth({
    database: new Database("database.db")
})

type Session = typeof auth.$Infer.Session

추가 필드

Better Auth를 사용하면 user와 session 객체에 추가 필드를 추가할 수 있습니다. 모든 추가 필드는 적절히 추론되며 서버와 클라이언트 측에서 사용할 수 있습니다.

import { betterAuth } from "better-auth"
import Database from "better-sqlite3"

export const auth = betterAuth({
    database: new Database("database.db"),
    user: {
       additionalFields: {
          role: {
              type: "string",
              input: false
            }
        }
    }

})

type Session = typeof auth.$Infer.Session

위 예제에서 user 객체에 role 필드를 추가했습니다. 이 필드는 이제 Session 타입에서 사용할 수 있습니다.

input 속성

추가 필드 설정의 input 속성은 해당 필드가 사용자 입력에 포함되어야 하는지를 결정합니다. 이 속성은 기본적으로 true이며, 필드가 등록과 같은 작업 중에 사용자 입력의 일부가 됨을 의미합니다.

필드가 사용자 입력의 일부가 되지 않도록 하려면 명시적으로 input: false를 설정해야 합니다:

additionalFields: {
    role: {
        type: "string",
        input: false
    }
}

inputfalse로 설정되면 필드가 사용자 입력에서 제외되어 사용자가 해당 필드의 값을 전달할 수 없게 됩니다.

기본적으로 추가 필드는 사용자 입력에 포함되며, 신중하게 처리하지 않으면 보안 취약점으로 이어질 수 있습니다. role과 같이 사용자가 설정해서는 안 되는 필드의 경우, 설정에서 input: false를 설정하는 것이 중요합니다.

클라이언트에서 추가 필드 추론하기

클라이언트 측에서 추가 필드의 적절한 타입 추론을 보장하려면 클라이언트에 이러한 필드에 대해 알려야 합니다. 프로젝트 구조에 따라 이를 달성하는 두 가지 접근 방식이 있습니다:

  1. Monorepo 또는 단일 프로젝트 설정의 경우

서버와 클라이언트 코드가 같은 프로젝트에 있는 경우, inferAdditionalFields 플러그인을 사용하여 서버 설정에서 추가 필드를 자동으로 추론할 수 있습니다.

import { inferAdditionalFields } from "better-auth/client/plugins";
import { createAuthClient } from "better-auth/react";
import type { auth } from "./auth";

export const authClient = createAuthClient({
  plugins: [inferAdditionalFields<typeof auth>()],
});
  1. 별도의 클라이언트-서버 프로젝트의 경우

클라이언트와 서버가 별도의 프로젝트에 있는 경우, auth 클라이언트를 생성할 때 추가 필드를 수동으로 지정해야 합니다.

import { inferAdditionalFields } from "better-auth/client/plugins";

export const authClient = createAuthClient({
  plugins: [inferAdditionalFields({
      user: {
        role: {
          type: "string"
        }
      }
  })],
});

On this page