Oracle ORA-28002 오류 원인과 해결 방법 완벽 가이드

ORA-28002
2026년 10월 03일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-28002 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-28002 the password will expire soon 는?

ORA-28002 에러는 Oracle 데이터베이스에서 현재 로그인한 사용자의 비밀번호 만료일이 임박했을 때 발생하는 경고성 메시지입니다. 이 에러는 Oracle의 보안 프로파일(Profile)에 설정된 PASSWORD_LIFE_TIME 파라미터에 의해 제어되며, 만료까지 남은 일수를 함께 알려줍니다. 실제로 접속 자체가 차단되지는 않지만, 만료일이 지나면 ORA-28001(the password has expired) 에러로 전환되어 로그인이 불가능해집니다.


주요 발생 원인

1. PASSWORD_LIFE_TIME 설정에 의한 비밀번호 유효기간 도래

Oracle Profile에는 비밀번호의 유효기간을 제한하는 PASSWORD_LIFE_TIME 파라미터가 존재합니다. 기본값은 Oracle 11g 이후부터 180일로 설정되어 있으며, 이 기간이 지나기 전 일정 시점(보통 7일 전)부터 ORA-28002 경고 메시지가 발생하기 시작합니다. 특히 운영 환경에서 자동 배치 작업이나 애플리케이션 서버가 이 계정을 사용하는 경우, 예고 없이 만료되어 서비스 장애로 이어질 수 있어 매우 주의해야 합니다.

2. DEFAULT Profile이 변경된 경우

Oracle 데이터베이스를 설치하면 모든 사용자는 기본적으로 DEFAULT 프로파일에 할당됩니다. DBA가 명시적으로 별도의 프로파일을 생성하지 않은 경우, DEFAULT 프로파일의 PASSWORD_LIFE_TIME이 변경되면 해당 설정을 따르는 모든 사용자에게 동시에 영향을 미칩니다. 특히 Oracle 11g로 업그레이드 시 기존에는 UNLIMITED였던 값이 180일로 자동 변경되어 다수의 사용자가 동시에 ORA-28002를 경험하는 상황이 발생할 수 있습니다.

3. 사용자별 개별 프로파일 미적용

개발, 운영, 배치 계정 등 목적별로 별도의 프로파일을 생성하지 않고 모든 계정에 동일한 프로파일을 적용한 경우, 보안 정책의 변경이 의도치 않은 계정에까지 영향을 줄 수 있습니다. 예를 들어, 배치 전용 계정은 비밀번호 만료 정책이 적용되면 자동 로그인이 불가능해져 야간 배치 작업 전체가 실패할 수 있습니다. 계정 유형에 따라 별도 프로파일을 설계하는 것이 실무적으로 매우 중요합니다.


해결 방법

1. 현재 비밀번호 만료 상태 확인

먼저 어떤 계정이 만료 위기에 처해 있는지 확인합니다.

-- 현재 사용자의 프로파일 및 만료일 확인
SELECT username,
       account_status,
       expiry_date,
       profile
FROM   dba_users
WHERE  account_status IN ('OPEN', 'EXPIRED(GRACE)')
ORDER  BY expiry_date ASC;
-- 프로파일별 PASSWORD_LIFE_TIME 확인
SELECT profile,
       resource_name,
       limit
FROM   dba_profiles
WHERE  resource_name = 'PASSWORD_LIFE_TIME'
ORDER  BY profile;

2. 즉각적인 비밀번호 변경 (사용자 본인)

가장 간단한 해결책은 사용자가 직접 비밀번호를 변경하는 것입니다.

-- 현재 로그인한 사용자가 비밀번호 변경
ALTER USER scott IDENTIFIED BY new_password123;

3. DBA가 비밀번호 만료 기간 재설정

비밀번호를 당장 바꾸기 어려운 경우, DBA가 만료 기간을 연장하는 방식으로 임시 처리할 수 있습니다.

-- 특정 사용자의 비밀번호를 동일하게 재설정하여 만료일 초기화
ALTER USER app_user IDENTIFIED BY current_password;

-- 또는 계정을 명시적으로 잠금 해제하여 grace period 리셋
ALTER USER app_user ACCOUNT UNLOCK;

4. 프로파일의 PASSWORD_LIFE_TIME을 UNLIMITED로 변경

배치 계정이나 애플리케이션 전용 계정처럼 비밀번호 만료 정책이 불필요한 경우, 프로파일을 수정합니다.

-- DEFAULT 프로파일의 비밀번호 유효기간을 무제한으로 변경
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

-- 특정 프로파일만 변경 (권장 방법)
ALTER PROFILE app_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED;

5. 특정 계정에 별도 프로파일 생성 후 할당

-- 배치 전용 프로파일 생성
CREATE PROFILE batch_profile LIMIT
  PASSWORD_LIFE_TIME     UNLIMITED
  PASSWORD_REUSE_TIME    UNLIMITED
  PASSWORD_REUSE_MAX     UNLIMITED
  FAILED_LOGIN_ATTEMPTS  10
  PASSWORD_LOCK_TIME     UNLIMITED;

-- 배치 계정에 새 프로파일 할당
ALTER USER batch_user PROFILE batch_profile;

-- 적용 확인
SELECT username, profile FROM dba_users WHERE username = 'BATCH_USER';

6. Grace Period 설정 확인 및 조정

-- PASSWORD_GRACE_TIME: 만료 후 경고 없이 접속 가능한 유예 기간 확인
SELECT profile, resource_name, limit
FROM   dba_profiles
WHERE  resource_name = 'PASSWORD_GRACE_TIME';

-- Grace Period를 7일로 설정
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 7;

예방 방법

1. 계정 유형별 프로파일 분리 관리

실무에서는 사람이 사용하는 계정(Human Account)과 애플리케이션/배치가 사용하는 계정(Service Account)을 반드시 분리하여 별도의 프로파일을 적용해야 합니다. Human Account에는 보안 규정에 맞는 비밀번호 만료 정책을 적용하고, Service Account에는 별도의 비밀번호 관리 절차와 함께 만료 정책을 신중히 설계해야 합니다. 아래 쿼리를 활용하여 주기적으로 만료 예정 계정을 모니터링하는 스크립트를 cron 또는 Oracle Scheduler로 자동화하는 것을 강력히 권장합니다.

-- 30일 이내 만료 예정 계정 사전 모니터링 쿼리
SELECT username,
       expiry_date,
       ROUND(expiry_date - SYSDATE, 0) AS days_until_expiry,
       profile,
       account_status
FROM   dba_users
WHERE  expiry_date IS NOT NULL
  AND  expiry_date BETWEEN SYSDATE AND SYSDATE + 30
ORDER  BY expiry_date ASC;

2. Oracle Scheduler를 활용한 자동 알림 체계 구축

비밀번호 만료를 사전에 감지하고 담당자에게 자동으로 알림을 발송하는 체계를 구축해야 합니다. Oracle의 DBMS_SCHEDULER와 UTL_MAIL 패키지를 조합하면 만료 예정 계정을 자동으로 이메일로 통보하는 Job을 만들 수 있습니다. 이를 통해 갑작스러운 서비스 중단 없이 사전에 비밀번호를 갱신하는 운영 프로세스를 정착시킬 수 있습니다.

-- 매일 오전 8시에 실행되는 만료 모니터링 Job 예시
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'PWD_EXPIRY_CHECK_JOB',
    job_type        => 'STORED_PROCEDURE',
    job_action      => 'PKG_SECURITY.CHECK_PASSWORD_EXPIRY',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=8; BYMINUTE=0; BYSECOND=0',
    enabled         => TRUE,
    comments        => '비밀번호 만료 예정 계정 일일 점검 Job'
  );
END;
/

관련 에러

  • ORA-28001: the password has expired — ORA-28002의 다음 단계로, 비밀번호가 완전히 만료되어 로그인이 불가능한 상태입니다. Grace Period가 종료된 후 발생하며, DBA가 직접 비밀번호를 재설정해 주어야 합니다.
  • ORA-28003: password verification for the specified password failed — 비밀번호 복잡도 검증 함수에 의해 새 비밀번호가 조건을 충족하지 못할 때 발생합니다. 비밀번호 변경 시 함께 마주칠 수 있는 에러입니다.
  • ORA-28000: the account is locked — 반복적인 로그인 실패 또는 DBA에 의한 명시적 잠금으로 계정이 잠긴 상태입니다. FAILED_LOGIN_ATTEMPTS 프로파일 설정과 관련이 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기