diff --git a/features/auth/actions.ts b/features/auth/actions.ts index 529a884..7383dc8 100644 --- a/features/auth/actions.ts +++ b/features/auth/actions.ts @@ -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 - 사용자 비밀번호 diff --git a/features/auth/constants.ts b/features/auth/constants.ts index a7393c6..a5f00f6 100644 --- a/features/auth/constants.ts +++ b/features/auth/constants.ts @@ -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;