NextAuth.js에서 시크릿 키
NextAuth.js는 안전한 인증 시스템을 제공하는 라이브러리로, 보안을 위해 시크릿 키(Secret Key) 를 필요로 합니다.
시크릿 키는 JWT 토큰 서명 및 암호화된 세션 관리 등에 사용됩니다.
openssl rand -base64 32
openssl rand -base64 32는 32바이트 길이의 무작위 데이터를 생성하고 이를 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 Variables → NEXTAUTH_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 |