refactor: 비밀번호 검증 규칙 통일
- 비밀번호 규칙을 8자 + 대소문자/숫자/특수문자로 통일 - constants.ts와 actions.ts의 검증 로직 일치
This commit is contained in:
@@ -46,15 +46,31 @@ function extractAuthData(formData: FormData): AuthFormData {
|
||||
* @returns AuthError | null - 에러가 있으면 에러 객체, 없으면 null
|
||||
*/
|
||||
function validatePassword(password: string): AuthError | null {
|
||||
// 1. 최소 길이 체크 (6자 이상)
|
||||
if (password.length < 6) {
|
||||
// 1. 최소 길이 체크 (8자 이상)
|
||||
if (password.length < 8) {
|
||||
return {
|
||||
message: AUTH_ERROR_MESSAGES.PASSWORD_TOO_SHORT,
|
||||
type: "validation",
|
||||
};
|
||||
}
|
||||
|
||||
// 2. 숫자 포함 여부
|
||||
// 2. 대문자 포함 여부
|
||||
if (!/[A-Z]/.test(password)) {
|
||||
return {
|
||||
message: AUTH_ERROR_MESSAGES.PASSWORD_TOO_WEAK,
|
||||
type: "validation",
|
||||
};
|
||||
}
|
||||
|
||||
// 3. 소문자 포함 여부
|
||||
if (!/[a-z]/.test(password)) {
|
||||
return {
|
||||
message: AUTH_ERROR_MESSAGES.PASSWORD_TOO_WEAK,
|
||||
type: "validation",
|
||||
};
|
||||
}
|
||||
|
||||
// 4. 숫자 포함 여부
|
||||
if (!/[0-9]/.test(password)) {
|
||||
return {
|
||||
message: AUTH_ERROR_MESSAGES.PASSWORD_TOO_WEAK,
|
||||
@@ -62,7 +78,7 @@ function validatePassword(password: string): AuthError | null {
|
||||
};
|
||||
}
|
||||
|
||||
// 3. 특수문자 포함 여부
|
||||
// 5. 특수문자 포함 여부
|
||||
if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) {
|
||||
return {
|
||||
message: AUTH_ERROR_MESSAGES.PASSWORD_TOO_WEAK,
|
||||
@@ -82,7 +98,7 @@ function validatePassword(password: string): AuthError | null {
|
||||
* 검증 항목:
|
||||
* 1. 빈 값 체크 - 이메일 또는 비밀번호가 비어있는지 확인
|
||||
* 2. 이메일 형식 - '@' 포함 여부로 간단한 형식 검증
|
||||
* 3. 비밀번호 길이 - 최소 6자 이상인지 확인 (Supabase 기본 요구사항)
|
||||
* 3. 비밀번호 강도 - 8자 이상, 대소문자/숫자/특수문자 포함 확인
|
||||
*
|
||||
* @param email - 사용자 이메일
|
||||
* @param password - 사용자 비밀번호
|
||||
|
||||
@@ -27,9 +27,10 @@ export const AUTH_ERROR_MESSAGES = {
|
||||
INVALID_EMAIL: "올바른 이메일 형식이 아닙니다.",
|
||||
|
||||
// === 비밀번호 관련 ===
|
||||
PASSWORD_TOO_SHORT: "비밀번호는 최소 6자 이상이어야 합니다.",
|
||||
PASSWORD_TOO_SHORT: "비밀번호는 최소 8자 이상이어야 합니다.",
|
||||
PASSWORD_TOO_WEAK:
|
||||
"비밀번호는 최소 6자 이상, 숫자, 특수문자를 각각 1개 이상 포함해야 합니다.",
|
||||
"비밀번호는 최소 8자 이상, 대문자, 소문자, 숫자, 특수문자를 각각 1개 이상 포함해야 합니다.",
|
||||
PASSWORD_MISMATCH: "비밀번호가 일치하지 않습니다.",
|
||||
PASSWORD_SAME_AS_OLD: "새 비밀번호는 기존 비밀번호와 달라야 합니다.",
|
||||
|
||||
// === 비밀번호 재설정 ===
|
||||
@@ -40,6 +41,16 @@ export const AUTH_ERROR_MESSAGES = {
|
||||
// === 인증 링크 ===
|
||||
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:
|
||||
"이메일 발송 제한을 초과했습니다. 잠시 후 다시 시도해 주세요.",
|
||||
@@ -86,9 +97,16 @@ export const PUBLIC_AUTH_PAGES = [
|
||||
|
||||
/**
|
||||
* 비밀번호 검증 규칙
|
||||
* - 최소 8자 이상
|
||||
* - 대문자 1개 이상
|
||||
* - 소문자 1개 이상
|
||||
* - 숫자 1개 이상
|
||||
* - 특수문자 1개 이상
|
||||
*/
|
||||
export const PASSWORD_RULES = {
|
||||
MIN_LENGTH: 6,
|
||||
MIN_LENGTH: 8,
|
||||
REQUIRE_UPPERCASE: true,
|
||||
REQUIRE_LOWERCASE: true,
|
||||
REQUIRE_NUMBER: true,
|
||||
REQUIRE_SPECIAL_CHAR: true,
|
||||
} as const;
|
||||
|
||||
Reference in New Issue
Block a user