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

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

이 글에서 다루는 내용

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

ORA-28001 the password has expired 는?

ORA-28001 에러는 Oracle 데이터베이스 사용자 계정의 비밀번호가 만료되었을 때 발생하는 오류입니다. Oracle은 보안 정책(Profile)을 통해 비밀번호의 유효 기간을 관리하며, 설정된 기간이 지나면 해당 계정으로의 로그인을 차단하고 이 에러를 반환합니다. 주로 운영 환경에서 배치 잡이나 애플리케이션 서버가 새벽에 갑자기 DB 연결에 실패하면서 처음 인지되는 경우가 많아 실무에서 매우 당혹스러운 상황을 만들어냅니다.


주요 발생 원인

  • Oracle Profile의 PASSWORD_LIFE_TIME 설정

Oracle 11g부터 기본 Profile(DEFAULT)의 PASSWORD_LIFE_TIME이 180일로 설정되어 있습니다. 이전 버전에서는 UNLIMITED였던 이 값이 11g 업그레이드 이후 자동으로 변경되어, 운영 중이던 많은 시스템에서 예기치 않게 ORA-28001이 발생하는 주요 원인이 됩니다. 특히 Oracle 10g에서 11g로 마이그레이션한 직후 약 6개월 뒤에 대규모로 발생하는 패턴이 자주 보고됩니다.

  • DBA에 의한 수동 비밀번호 만료 처리

보안 감사나 정책 적용을 위해 DBA가 ALTER USER ... PASSWORD EXPIRE 명령을 실행하여 특정 계정의 비밀번호를 강제로 만료시키는 경우입니다. 이 경우 해당 계정으로 다음 로그인 시도 즉시 ORA-28001이 발생하며, 애플리케이션 계정에 적용될 경우 서비스 장애로 이어질 수 있어 각별한 주의가 필요합니다.

  • PASSWORD_GRACE_TIME 초과

PASSWORD_GRACE_TIME은 비밀번호 만료 후 변경을 유예해주는 기간입니다. 이 유예 기간 동안에는 로그인은 가능하지만 비밀번호 변경을 요구하는 경고가 표시됩니다. 유예 기간마저 초과하면 완전히 로그인이 차단되며 ORA-28001이 발생하게 됩니다. 많은 현장에서 유예 기간 동안의 경고를 무시하다가 결국 장애로 이어지는 사례가 빈번합니다.


해결 방법

즉각적인 비밀번호 초기화 (가장 빠른 해결)

DBA 권한으로 접속하여 만료된 계정의 비밀번호를 재설정합니다.

-- DBA 계정으로 접속 후 비밀번호 변경
ALTER USER 계정명 IDENTIFIED BY 새비밀번호;

-- 예시: appuser 계정 비밀번호 재설정
ALTER USER appuser IDENTIFIED BY NewSecurePass#2024;

계정 상태 확인

먼저 해당 계정의 상태를 확인하여 정확한 원인을 파악합니다.

-- 사용자 계정 상태 및 만료 정보 조회
SELECT username,
       account_status,
       expiry_date,
       profile,
       lock_date
FROM   dba_users
WHERE  username = 'APPUSER';

-- 모든 만료된 계정 조회
SELECT username,
       account_status,
       expiry_date,
       profile
FROM   dba_users
WHERE  account_status IN ('EXPIRED', 'EXPIRED(GRACE)', 'EXPIRED & LOCKED')
ORDER BY expiry_date;

Profile의 비밀번호 정책 확인

-- 현재 적용된 Profile의 비밀번호 정책 조회
SELECT profile,
       resource_name,
       limit
FROM   dba_profiles
WHERE  resource_name IN (
           'PASSWORD_LIFE_TIME',
           'PASSWORD_GRACE_TIME',
           'PASSWORD_REUSE_TIME',
           'PASSWORD_REUSE_MAX',
           'FAILED_LOGIN_ATTEMPTS'
       )
ORDER BY profile, resource_name;

PASSWORD_LIFE_TIME을 UNLIMITED로 변경 (운영 계정용)

애플리케이션 전용 계정처럼 비밀번호가 자주 변경되어서는 안 되는 계정에 대해 별도 Profile을 생성합니다.

-- 애플리케이션 전용 Profile 생성
CREATE PROFILE app_profile LIMIT
    PASSWORD_LIFE_TIME    UNLIMITED
    PASSWORD_GRACE_TIME   UNLIMITED
    FAILED_LOGIN_ATTEMPTS 10
    PASSWORD_LOCK_TIME    1/24;

-- 해당 Profile을 계정에 적용
ALTER USER appuser PROFILE app_profile;

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

DEFAULT Profile 자체를 변경 (전체 적용 시)

-- DEFAULT Profile의 PASSWORD_LIFE_TIME 변경
-- 주의: 모든 DEFAULT Profile 사용 계정에 영향을 줌
ALTER PROFILE default LIMIT PASSWORD_LIFE_TIME UNLIMITED;

-- 변경 확인
SELECT profile, resource_name, limit
FROM   dba_profiles
WHERE  profile = 'DEFAULT'
AND    resource_name = 'PASSWORD_LIFE_TIME';

이미 만료된 계정의 비밀번호를 동일한 값으로 유지하고 싶을 때

-- PASSWORD_REUSE_TIME과 PASSWORD_REUSE_MAX 설정 확인 후
-- 동일 비밀번호 재사용이 가능한 경우에만 사용
ALTER USER appuser IDENTIFIED BY VALUES (
    SELECT password FROM dba_users WHERE username = 'APPUSER'
);

-- Oracle 11g 이상에서는 해시값을 직접 사용 (sys.user$ 참조)
SELECT name, password, spare4
FROM   sys.user$
WHERE  name = 'APPUSER';

예방 방법

  • 애플리케이션 계정 전용 Profile 분리 운영

운영 환경의 애플리케이션 DB 계정은 반드시 별도의 Profile로 관리하여 비밀번호 만료 정책에서 분리하는 것이 가장 근본적인 예방책입니다. 사람이 사용하는 계정과 애플리케이션이 사용하는 서비스 계정은 보안 정책을 달리 적용하는 것이 실무 Best Practice입니다. 아래 모니터링 쿼리를 스케줄러에 등록하여 만료 30일 전부터 경보를 발생시키도록 구성하세요.

“`sql

— 비밀번호 만료 30일 이내 계정 사전 점검 쿼리 (매일 실행 권장)

SELECT username,

account_status,

expiry_date,

profile,

ROUND(expiry_date – SYSDATE, 0) AS days_until_expiry

FROM dba_users

WHERE account_status NOT IN (‘LOCKED’, ‘EXPIRED & LOCKED’)

AND expiry_date IS NOT NULL

AND expiry_date – SYSDATE <= 30

ORDER BY expiry_date ASC;

“`

  • Oracle Enterprise Manager 또는 사용자 정의 알림 설정

OEM(Oracle Enterprise Manager)의 Metric 알림 기능을 활용하거나, 위의 모니터링 쿼리를 DBMS_SCHEDULER로 등록하여 만료 예정 계정에 대한 이메일 알림을 자동화하세요. 서비스 장애는 항상 예고 없이 찾아오지만, 비밀번호 만료는 expiry_date를 통해 사전에 충분히 예측하고 대응할 수 있는 문제입니다.

“`sql

— DBMS_SCHEDULER를 이용한 만료 예정 계정 점검 Job 등록 예시

BEGIN

DBMS_SCHEDULER.CREATE_JOB(

job_name => ‘CHECK_PWD_EXPIRY’,

job_type => ‘PLSQL_BLOCK’,

job_action => ‘

DECLARE

v_count NUMBER;

BEGIN

SELECT COUNT(*)

INTO v_count

FROM dba_users

WHERE expiry_date – SYSDATE <= 30

AND expiry_date IS NOT NULL

AND account_status = ”OPEN”;

IF v_count > 0 THEN

— 알림 발송 로직 (UTL_MAIL 등 활용)

NULL;

END IF;

END;’,

start_date => SYSTIMESTAMP,

repeat_interval => ‘FREQ=DAILY;BYHOUR=9;BYMINUTE=0’,

enabled => TRUE,

comments => ‘비밀번호 만료 예정 계정 일일 점검’

);

END;

/

“`


관련 에러

  • ORA-28000: the account is locked — 로그인 실패 횟수 초과로 계정이 잠긴 경우로, ORA-28001과 함께 자주 발생합니다. 비밀번호 만료 후 틀린 비밀번호로 반복 시도 시 ORA-28000으로 전환됩니다.
  • ORA-28002: the password will expire within N days — 비밀번호 유예 기간(GRACE_TIME) 중 로그인 시 표시되는 경고성 메시지입니다. 이 에러를 방치하면 결국 ORA-28001로 이어집니다.
  • ORA-28003: password verification for the specified password failed — 비밀번호 변경 시 복잡도 검증 함수(PASSWORD_VERIFY_FUNCTION)를 통과하지 못한 경우 발생합니다.
  • ORA-28007: the password cannot be reused — PASSWORD_REUSE_TIME 또는 PASSWORD_REUSE_MAX 정책으로 인해 이전에 사용한 비밀번호를 재사용하려 할 때 발생합니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기