Skip to content
Migrating from NextAuth.js v4? Read our migration guide.
시작하기타입스크립트

TypeScript

Auth.js는 타입 안전성을 중요하게 여기기 때문에 TypeScript로 작성되었으며 100% 타입 안전합니다. 여러분의 프로젝트에서 사용할 수 있는 자체 타입 정의를 제공합니다.

TypeScript를 사용하지 않더라도 VS Code와 같은 IDE는 이를 인식하여 더 나은 개발자 경험을 제공합니다. 코드를 작성하는 동안 특정 객체나 함수가 어떻게 생겼는지에 대한 제안을 받을 수 있으며, 때로는 문서, 예제, 그리고 유용한 리소스에 대한 링크도 제공됩니다.

철학

여러분이 Auth.js 리소스를 확장할 경우, 애플리케이션 전반에 걸쳐 타입을 지정하는 주요 기술로 제네릭 대신 모듈 확장을 선택했습니다.

제네릭을 사용하지 않나요?

서브모듈 간에 공유되는 인터페이스는 제네릭으로 Auth.js 라이브러리 함수에 전달되지 않습니다.

이러한 타입이 사용될 때마다, 함수는 항상 해당 형식을 반환할 것으로 기대합니다. 제네릭을 사용하면 한 곳에서 타입을 재정의할 수 있지만, 다른 곳에서는 그렇지 않을 수 있어 타입이 구현과 일치하지 않을 수 있습니다.

모듈 확장을 사용하면 타입을 한 번 정의하고, 예상되는 곳에서 항상 동일한 타입임을 확신할 수 있습니다.

모듈 확장

Auth.js 라이브러리들은 서브모듈과 다른 Auth.js 라이브러리들 간에 공유되는 특정 인터페이스들을 제공합니다. 예를 들어, next-auth@auth/prisma-adapter@auth/core의 타입들을 사용합니다.

이러한 인터페이스의 좋은 예로 Session이나 User가 있습니다. 여러분은 TypeScript의 모듈 확장을 사용하여 이러한 타입들을 확장하고, Auth.js 전반에 걸쳐 여러분만의 속성들을 추가할 수 있습니다. 이렇게 하면 제네릭을 계속 전달할 필요가 없습니다.

예를 들어 Session을 확장해 보겠습니다.

auth.ts
import NextAuth, { type DefaultSession } from "next-auth"
 
declare module "next-auth" {
  /**
   * `auth`, `useSession`, `getSession`에 의해 반환되며, `SessionProvider` React Context의 prop으로 전달됨
   */
  interface Session {
    user: {
      /** 사용자의 우편 주소 */
      address: string
      /**
       * 기본적으로 TypeScript는 새로운 인터페이스 속성을 병합하고 기존 속성을 덮어씀.
       * 이 경우, 기본 세션 사용자 속성이 덮어쓰여지므로,
       * 새로 정의한 속성과 함께 기본 세션 사용자 속성을 다시 추가해야 함.
       */
    } & DefaultSession["user"]
  }
}
 
export const { auth, handlers } = NextAuth({
  callbacks: {
    session({ session, token, user }) {
      // `session.user.address`는 이제 유효한 속성이 되며,
      // `useSession().data.user`나 `auth().user` 같은 곳에서 타입 체크가 됨
      return {
        ...session,
        user: {
          ...session.user,
          address: user.address,
        },
      }
    },
  },
})

모듈 확장은 특정 인터페이스에만 국한되지 않습니다. 우리가 정의한 어떤 interface든 확장할 수 있습니다. 다음은 여러분의 사용 사례에 따라 재정의할 수 있는 일반적인 인터페이스들입니다.

types.d.ts
declare module "next-auth" {
  /**
   * OAuth 제공자의 `profile` 콜백이나 데이터베이스를 사용할 때 `session` 콜백의 두 번째 매개변수로 반환되는 사용자 객체의 형태
   */
  interface User {}
  /**
   * OAuth 제공자의 `account` 콜백으로 반환되는 계정 객체의 형태.
   * 일반적으로 사용 중인 제공자에 대한 정보(예: OAuth 토큰 `access_token` 등)를 포함함.
   */
  interface Account {}
 
  /**
   * `useSession`, `auth`에 의해 반환되며, 활성 세션에 대한 정보를 포함함.
   */
  interface Session {}
}
 
// `JWT` 인터페이스는 `next-auth/jwt` 서브모듈에서 찾을 수 있음
import { JWT } from "next-auth/jwt"
 
declare module "next-auth/jwt" {
  /** JWT 세션을 사용할 때 `jwt` 콜백과 `auth`에 의해 반환됨 */
  interface JWT {
    /** OpenID ID 토큰 */
    idToken?: string
  }
}

모듈 선언은 프로젝트의 tsconfig.json“포함된” 어떤 파일에든 추가할 수 있습니다.

리소스

  1. TypeScript 문서: 모듈 확장
  2. DigitalOcean: TypeScript에서 모듈 확장하기
  3. 데이터베이스 어댑터 만들기
Auth.js © Balázs Orbán and Team - 2025