133 lines
4.2 KiB
TypeScript
133 lines
4.2 KiB
TypeScript
/**
|
|
* [인증 관련 상수 정의]
|
|
*
|
|
* 인증 모듈 전체에서 공통으로 사용하는 상수들을 정의합니다.
|
|
* - 에러 메시지
|
|
* - 라우트 경로
|
|
* - 검증 규칙
|
|
*/
|
|
|
|
// ========================================
|
|
// 에러 메시지 상수
|
|
// ========================================
|
|
|
|
/**
|
|
* 인증 에러 메시지 매핑
|
|
* Supabase의 영문 에러를 한글로 변환하기 위한 매핑 테이블
|
|
*/
|
|
export const AUTH_ERROR_MESSAGES = {
|
|
// === 로그인/회원가입 관련 ===
|
|
INVALID_CREDENTIALS: "이메일 또는 비밀번호가 일치하지 않습니다.",
|
|
USER_EXISTS: "이미 가입된 이메일 주소입니다.",
|
|
EMAIL_NOT_CONFIRMED: "이메일 인증이 완료되지 않았습니다.",
|
|
|
|
// === 입력값 검증 ===
|
|
EMPTY_FIELDS: "이메일과 비밀번호를 모두 입력해 주세요.",
|
|
EMPTY_EMAIL: "이메일을 입력해 주세요.",
|
|
INVALID_EMAIL: "올바른 이메일 형식이 아닙니다.",
|
|
|
|
// === 비밀번호 관련 ===
|
|
PASSWORD_TOO_SHORT: "비밀번호는 최소 8자 이상이어야 합니다.",
|
|
PASSWORD_TOO_WEAK:
|
|
"비밀번호는 최소 8자 이상, 대문자, 소문자, 숫자, 특수문자를 각각 1개 이상 포함해야 합니다.",
|
|
PASSWORD_MISMATCH: "비밀번호가 일치하지 않습니다.",
|
|
PASSWORD_SAME_AS_OLD: "새 비밀번호는 기존 비밀번호와 달라야 합니다.",
|
|
|
|
// === 비밀번호 재설정 ===
|
|
PASSWORD_RESET_SENT: "비밀번호 재설정 링크를 이메일로 발송했습니다.",
|
|
PASSWORD_RESET_SUCCESS: "비밀번호가 성공적으로 변경되었습니다.",
|
|
PASSWORD_RESET_FAILED: "비밀번호 변경에 실패했습니다.",
|
|
|
|
// === 인증 링크 ===
|
|
INVALID_AUTH_LINK: "인증 링크가 만료되었거나 유효하지 않습니다.",
|
|
|
|
// === 소셜 로그인 (OAuth) 관련 ===
|
|
OAUTH_ACCESS_DENIED: "로그인이 취소되었습니다.",
|
|
OAUTH_SERVER_ERROR:
|
|
"인증 서버 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.",
|
|
OAUTH_INVALID_SCOPE:
|
|
"필요한 권한이 설정되지 않았습니다. 개발자 설정 확인이 필요합니다.",
|
|
OAUTH_UNAUTHORIZED_CLIENT:
|
|
"인증 앱 설정(Client ID/Secret)에 문제가 있습니다.",
|
|
OAUTH_UNKNOWN_ERROR: "소셜 로그인 중 알 수 없는 오류가 발생했습니다.",
|
|
|
|
// === Rate Limit ===
|
|
EMAIL_RATE_LIMIT:
|
|
"이메일 발송 제한을 초과했습니다. 잠시 후 다시 시도해 주세요.",
|
|
EMAIL_RATE_LIMIT_DETAILED:
|
|
"이메일 발송 제한을 초과했습니다. Supabase 무료 플랜은 시간당 이메일 발송 횟수가 제한됩니다. 약 1시간 후에 다시 시도해 주세요.",
|
|
|
|
// === 기타 ===
|
|
DEFAULT: "요청을 처리하는 중 오류가 발생했습니다.",
|
|
} as const;
|
|
|
|
// ========================================
|
|
// 라우트 경로 상수
|
|
// ========================================
|
|
|
|
/**
|
|
* 인증 관련 라우트 경로
|
|
*/
|
|
export const AUTH_ROUTES = {
|
|
LOGIN: "/login",
|
|
SIGNUP: "/signup",
|
|
FORGOT_PASSWORD: "/forgot-password",
|
|
RESET_PASSWORD: "/reset-password",
|
|
AUTH_CONFIRM: "/auth/confirm",
|
|
AUTH_CALLBACK: "/auth/callback",
|
|
HOME: "/",
|
|
} as const;
|
|
|
|
/**
|
|
* 로그인 없이 접근 가능한 페이지 목록
|
|
* 미들웨어에서 라우트 보호에 사용
|
|
*/
|
|
export const PUBLIC_AUTH_PAGES = [
|
|
AUTH_ROUTES.LOGIN,
|
|
AUTH_ROUTES.SIGNUP,
|
|
AUTH_ROUTES.FORGOT_PASSWORD,
|
|
AUTH_ROUTES.RESET_PASSWORD,
|
|
AUTH_ROUTES.AUTH_CONFIRM,
|
|
AUTH_ROUTES.AUTH_CALLBACK,
|
|
] as const;
|
|
|
|
// ========================================
|
|
// 검증 규칙 상수
|
|
// ========================================
|
|
|
|
/**
|
|
* 비밀번호 검증 규칙
|
|
* - 최소 8자 이상
|
|
* - 대문자 1개 이상
|
|
* - 소문자 1개 이상
|
|
* - 숫자 1개 이상
|
|
* - 특수문자 1개 이상
|
|
*/
|
|
export const PASSWORD_RULES = {
|
|
MIN_LENGTH: 8,
|
|
REQUIRE_UPPERCASE: true,
|
|
REQUIRE_LOWERCASE: true,
|
|
REQUIRE_NUMBER: true,
|
|
REQUIRE_SPECIAL_CHAR: true,
|
|
} as const;
|
|
|
|
// ========================================
|
|
// 타입 정의
|
|
// ========================================
|
|
|
|
/**
|
|
* 인증 폼 데이터 타입
|
|
*/
|
|
export type AuthFormData = {
|
|
email: string;
|
|
password: string;
|
|
};
|
|
|
|
/**
|
|
* 인증 에러 타입
|
|
*/
|
|
export type AuthError = {
|
|
message: string;
|
|
type: "validation" | "auth" | "unknown";
|
|
};
|