본문 바로가기

개발 공부/React

NextAuth.js의 보안 시크릿 키

NextAuth.js에서 시크릿 키

NextAuth.js는 안전한 인증 시스템을 제공하는 라이브러리로, 보안을 위해 시크릿 키(Secret Key) 를 필요로 합니다.

시크릿 키는 JWT 토큰 서명 및 암호화된 세션 관리 등에 사용됩니다.

 


openssl rand -base64 32

openssl rand -base64 3232바이트 길이의 무작위 데이터를 생성하고 이를 Base64 형식으로 인코딩하는 명령어입니다.

이 명령어를 실행하면 랜덤한 문자열이 생성되며, 이를 보안 키로 활용할 수 있습니다.

openssl rand -base64 32
  • openssl: OpenSSL 유틸리티 실행
  • rand: 랜덤 바이트 생성
  • -base64: Base64로 인코딩
  • 32: 32바이트 길이의 난수 생성

실행 결과 예시

+2Lz7J9XVXwY/8nqK9hR9q1hfj2b8sMz5B0q0oYpVPU=
  • 이처럼 예측할 수 없는 랜덤한 값이 생성되며, 보안 키로 사용할 수 있습니다.

 


NEXTAUTH_SECRET 환경 변수

NextAuth.js는 .env.local 파일에서 NEXTAUTH_SECRET 값을 설정하도록 권장합니다.

이 값은 강력한 무작위성을 가져야 하며, openssl rand -base64 32 명령어를 이용해 생성할 수 있습니다.

env.local 파일 설정 예시

NEXTAUTH_SECRET="+2Lz7J9XVXwY/8nqK9hR9q1hfj2b8sMz5B0q0oYpVPU="

 


NextAuth.js에서 시크릿 키 사용

이제 생성한 NEXTAUTH_SECRET 값을 NextAuth 설정 파일에서 사용할 수 있습니다.

NextAuth 설정 (auth.ts 또는 [...nextauth].ts)

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        username: { label: "Username", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        if (credentials.username === "admin" && credentials.password === "password") {
          return { id: "1", name: "Admin User" };
        }
        return null;
      },
    }),
  ],
  secret: process.env.NEXTAUTH_SECRET, //  환경 변수에서 시크릿 키 사용
});

 

 

NEXTAUTH_SECRET은 보안을 위해 필수적이며, 주요 역할은 다음과 같습니다.

JWT 서명(Signing) 보호

NextAuth.js는 기본적으로 JWT(Json Web Token) 를 사용하여 사용자 인증을 관리합니다.

JWT는 서버에서 생성하여 클라이언트에게 전달되며, 유효성을 확인하기 위해 서명이 필요합니다.

NEXTAUTH_SECRET이 설정되지 않으면, 공격자가 서명을 변조하여 인증된 사용자로 가장할 위험이 있습니다.

  • 시크릿 키가 있으면: 서명된 JWT를 변경할 수 없음 (무결성 보장)
  • 시크릿 키가 없으면: 공격자가 JWT를 조작하여 악용 가능

 

세션 암호화(Encrypted Session)

NextAuth.js는 세션 데이터를 암호화하여 보관할 수 있습니다. 이때 NEXTAUTH_SECRET을 사용하여 세션 정보를 암호화하고, 이를 복호화할 때도 같은 시크릿 키를 사용합니다.

따라서, 키가 없다면 세션을 해독할 수 없습니다.

  • 시크릿 키가 있으면: 세션 데이터가 암호화되어 보호됨
  • 시크릿 키가 없으면: 세션 정보가 노출될 위험이 있음

 

CSRF 및 Replay Attack 방지

시크릿 키를 사용하면 CSRF 공격(사이트 간 요청 위조)과 Replay Attack(재전송 공격)을 방지하는 데 도움이 됩니다.

NextAuth.js는 내부적으로 CSRF 토큰을 생성하고 검증하는데, 시크릿 키를 사용하여 이 값을 보호합니다.

  • 시크릿 키가 있으면: 요청이 위조되지 않도록 보호
  • 시크릿 키가 없으면: 공격자가 인증된 세션을 가로채 악용할 가능성 증가

 


시크릿 키 관리 

.env.local 파일에 저장

시크릿 키는 코드에 직접 노출되지 않도록 환경 변수로 관리해야 합니다.

 gitignore 설정 확인

.env.local 파일이 Git 저장소에 커밋되지 않도록 .gitignore에 추가해야 합니다.

.env.local

 

배포 시 환경 변수 설정

Vercel과 같은 호스팅 서비스에서 환경 변수를 설정하는 것이 중요합니다.

  • Vercel: 프로젝트 설정 → Environment VariablesNEXTAUTH_SECRET 추가
  • Docker: -e NEXTAUTH_SECRET=your_secret_key 옵션으로 실행

'개발 공부 > React' 카테고리의 다른 글

Next.js Metadata  (0) 2025.03.10
Next.js Middleware  (0) 2025.03.09
React useActionState  (0) 2025.03.06
React Dynamic Route Segments  (0) 2025.03.03
Next.js revalidatePath, redirect  (0) 2025.02.26