2026년 10월 04일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-28011 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-28011 the account will expire soon; change your password now 는?
ORA-28011은 Oracle 데이터베이스 계정의 비밀번호 만료가 임박했을 때 발생하는 경고성 에러입니다. Oracle의 프로파일(Profile)에 설정된 PASSWORD_LIFE_TIME 파라미터에 의해 비밀번호 유효 기간이 관리되며, 만료 기한이 가까워지면 로그인 시 이 메시지가 표시됩니다. 이 에러는 즉시 접속을 차단하지는 않지만, 유예 기간(GRACE PERIOD) 이후에는 ORA-28001(계정 잠금)로 이어질 수 있어 운영 환경에서 반드시 사전에 조치해야 합니다.
주요 발생 원인
1. PASSWORD_LIFE_TIME 설정으로 인한 비밀번호 만료 임박
Oracle 데이터베이스는 보안 정책 강화를 위해 기본 프로파일(DEFAULT Profile)에 PASSWORD_LIFE_TIME을 설정합니다. Oracle 11g 이상부터는 기본값이 180일로 설정되어 있어, 별도 변경 없이 사용하면 6개월마다 이 경고가 발생합니다. 특히 애플리케이션 서버가 DB 계정으로 접속하는 환경에서는 이 경고가 서비스 장애로 이어지는 경우가 많습니다.
2. DEFAULT 프로파일이 변경된 상황에서 계정에 명시적 프로파일이 미적용
많은 운영 환경에서 DEFAULT 프로파일의 보안 설정을 강화하면서 기존에 생성된 계정들이 자동으로 영향을 받습니다. 특정 계정에 별도의 커스텀 프로파일이 적용되어 있지 않다면, DEFAULT 프로파일의 변경 사항이 그대로 적용되어 예상치 못한 시점에 ORA-28011이 발생할 수 있습니다. 이는 DBA가 모든 계정의 프로파일 할당 현황을 주기적으로 점검해야 하는 이유입니다.
3. 비밀번호 만료 유예 기간(PASSWORD_GRACE_TIME) 진입
PASSWORD_GRACE_TIME은 비밀번호가 만료된 이후에도 일정 기간 동안 기존 비밀번호로 로그인을 허용하는 유예 기간입니다. 이 유예 기간 동안 매 로그인 시마다 ORA-28011 경고 메시지가 발생합니다. 유예 기간이 종료되면 ORA-28001 에러로 전환되어 계정이 완전히 잠기므로, 경고 단계에서 반드시 조치해야 합니다.
해결 방법
1. 현재 계정의 비밀번호 만료 상태 확인
먼저 문제가 되는 계정의 상태와 프로파일을 확인합니다.
-- 계정 상태 및 만료일 확인
SELECT username,
account_status,
expiry_date,
profile,
created
FROM dba_users
WHERE username = 'YOUR_USERNAME'
ORDER BY username;
-- 모든 만료 임박 계정 확인 (7일 이내 만료 예정)
SELECT username,
account_status,
expiry_date,
profile
FROM dba_users
WHERE expiry_date <= SYSDATE + 7
AND account_status NOT IN ('LOCKED', 'EXPIRED')
ORDER BY expiry_date;
2. 비밀번호 즉시 변경 (가장 권장되는 해결책)
-- 해당 사용자로 접속하여 직접 변경
ALTER USER your_username IDENTIFIED BY "NewPassword123!";
-- DBA 권한으로 타 사용자 비밀번호 변경
CONN sys/password AS SYSDBA;
ALTER USER app_user IDENTIFIED BY "NewSecurePass!2024";
-- 비밀번호 변경 후 만료일 확인
SELECT username, expiry_date, account_status
FROM dba_users
WHERE username = 'APP_USER';
3. 프로파일의 PASSWORD_LIFE_TIME 확인 및 수정
-- 현재 프로파일의 비밀번호 정책 확인
SELECT profile,
resource_name,
limit
FROM dba_profiles
WHERE resource_name IN (
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME',
'PASSWORD_REUSE_TIME',
'PASSWORD_REUSE_MAX'
)
ORDER BY profile, resource_name;
-- 특정 프로파일의 PASSWORD_LIFE_TIME을 365일로 변경
ALTER PROFILE default LIMIT PASSWORD_LIFE_TIME 365;
-- 애플리케이션 전용 프로파일 생성 (비밀번호 만료 없음)
CREATE PROFILE app_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1/24;
-- 계정에 새 프로파일 적용
ALTER USER app_user PROFILE app_profile;
4. 이미 만료된 계정 복구
-- 만료된 계정 확인
SELECT username, account_status, expiry_date
FROM dba_users
WHERE account_status LIKE '%EXPIRED%';
-- 계정 잠금 해제 및 비밀번호 재설정
ALTER USER expired_user IDENTIFIED BY "ResetPassword!2024" ACCOUNT UNLOCK;
-- 비밀번호 만료 강제 해제 (임시 방편)
ALTER USER expired_user IDENTIFIED BY VALUES
(SELECT spare4 || ';' || password
FROM sys.user$ WHERE name = 'EXPIRED_USER');
5. 비밀번호 만료 모니터링 스크립트
-- 30일 이내 만료 예정 계정 조회 (정기 모니터링용)
SELECT u.username,
u.account_status,
u.expiry_date,
u.profile,
ROUND(u.expiry_date - SYSDATE) AS days_until_expiry
FROM dba_users u
WHERE u.expiry_date IS NOT NULL
AND u.expiry_date <= SYSDATE + 30
AND u.account_status = 'OPEN'
ORDER BY u.expiry_date;
예방 방법
1. 정기 모니터링 Job 설정 및 자동 알림 구성
DBMS_SCHEDULER를 이용하여 비밀번호 만료 예정 계정을 주기적으로 조회하고, 담당자에게 알림을 발송하는 자동화 체계를 구축하는 것이 Best Practice입니다. 특히 운영 환경에서는 만료 30일 전, 7일 전, 3일 전으로 단계적 알림을 설정하여 사전 대응 시간을 확보해야 합니다.
-- 스케줄러 Job 생성 예시 (매일 오전 9시 실행)
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'CHECK_PASSWORD_EXPIRY',
job_type => 'PLSQL_BLOCK',
job_action => '
BEGIN
-- 만료 임박 계정 로그 테이블에 기록
INSERT INTO password_expiry_log
SELECT username, expiry_date, SYSDATE
FROM dba_users
WHERE expiry_date <= SYSDATE + 30
AND account_status = ''OPEN'';
COMMIT;
END;',
start_date => SYSTIMESTAMP,
repeat_interval => ''FREQ=DAILY;BYHOUR=9;BYMINUTE=0'',
enabled => TRUE
);
END;
/
2. 애플리케이션 계정과 사람 계정의 프로파일 분리 관리
운영 DB에서 애플리케이션이 사용하는 서비스 계정(Service Account)과 실제 사람이 로그인하는 계정은 서로 다른 프로파일로 관리해야 합니다. 서비스 계정은 PASSWORD_LIFE_TIME UNLIMITED로 설정하되, 접근 IP 제한과 강력한 패스워드 복잡도 정책을 병행 적용하여 보안을 유지하는 것이 실무에서 권장되는 방식입니다.
-- 사람 계정용 프로파일 (보안 강화)
CREATE PROFILE human_profile LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1/24
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;
-- 애플리케이션 계정용 프로파일 (만료 없음, 복잡도 강화)
CREATE PROFILE app_service_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1/12
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;
관련 에러
- ORA-28001:
the password has expired— 비밀번호 유예 기간마저 종료되어 계정이 완전히 잠긴 상태입니다. ORA-28011의 경고를 무시했을 때 최종적으로 발생하는 에러입니다. - ORA-28002:
the password will expire within N days— ORA-28011과 유사하지만, 구체적으로 남은 만료 일수를 명시해주는 에러입니다. - ORA-28000:
the account is locked— 로그인 실패 횟수 초과 또는 DBA에 의해 계정이 잠긴 상태입니다. - ORA-28003:
password verification for the specified password failed— 새 비밀번호 설정 시 복잡도 정책을 만족하지 못할 때 발생합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.