2026년 06월 28일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01017 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01017 invalid username/password; logon denied 는?
ORA-01017은 Oracle 데이터베이스에 접속을 시도할 때 입력한 사용자명(username) 또는 비밀번호(password)가 올바르지 않을 경우 발생하는 에러입니다. 단순히 비밀번호를 잘못 입력한 경우뿐만 아니라, 대소문자 구분 설정, 계정 잠금, 접속 문자열 오류 등 다양한 원인으로 발생할 수 있어 실무에서 매우 자주 접하게 되는 에러 중 하나입니다. Oracle 11g 이후부터는 비밀번호가 대소문자를 구분(case-sensitive)하도록 기본 설정이 변경되었기 때문에, 업그레이드 이후 갑자기 이 에러가 발생하는 경우도 많습니다.
주요 발생 원인
1. 비밀번호 대소문자 구분 문제 (Case Sensitivity)
Oracle 11g 이전 버전에서는 비밀번호 대소문자를 구분하지 않았지만, 11g부터는 기본적으로 대소문자를 구분합니다. 이전 버전에서 업그레이드한 환경이나, 애플리케이션에서 대소문자를 혼용하여 비밀번호를 입력하면 ORA-01017이 발생합니다. 특히 레거시 시스템을 Oracle 12c나 19c로 마이그레이션할 때 가장 빈번하게 발생하는 원인입니다.
2. 잘못된 사용자명 또는 비밀번호 입력
접속 문자열에 사용자명 또는 비밀번호를 오타로 잘못 입력하거나, 설정 파일(tnsnames.ora, sqlnet.ora, 애플리케이션 설정 파일 등)에 잘못된 자격 증명이 저장되어 있는 경우입니다. 특히 여러 환경(개발, 스테이징, 운영)을 동시에 관리할 때 잘못된 환경의 자격 증명을 사용하는 실수가 자주 발생합니다.
3. 계정 잠금(Account Lock) 또는 만료(Expired)
비밀번호 정책(PASSWORD_LOCK_TIME, FAILED_LOGIN_ATTEMPTS)에 의해 계정이 잠겼거나, PASSWORD_LIFE_TIME 정책에 의해 비밀번호가 만료된 경우에도 ORA-01017이 발생할 수 있습니다. 잠긴 계정은 ORA-28000과 함께 나타나는 경우도 있지만, 일부 클라이언트 환경에서는 ORA-01017로만 표시되는 경우도 있으므로 반드시 계정 상태를 함께 확인해야 합니다.
해결 방법
원인 1: 비밀번호 대소문자 구분 문제 해결
먼저 현재 데이터베이스의 SEC_CASE_SENSITIVE_LOGON 파라미터를 확인합니다.
-- 현재 대소문자 구분 설정 확인
SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON;
-- 결과 예시
-- NAME TYPE VALUE
-- ------------------------------------ ----------- -----
-- sec_case_sensitive_logon boolean TRUE
임시 조치로 대소문자 구분을 비활성화할 수 있습니다. 단, 보안상 권장하지 않으며 근본적인 해결책은 비밀번호를 올바르게 입력하는 것입니다.
-- 대소문자 구분 비활성화 (임시 조치, 보안 주의)
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
-- 비밀번호를 대소문자 구분 없이 재설정 (권장 방법)
ALTER USER scott IDENTIFIED BY "Tiger123";
Oracle 12c 이후부터는 SEC_CASE_SENSITIVE_LOGON 파라미터가 deprecated되었으므로, 아래 방식으로 password version을 확인하는 것이 좋습니다.
-- 사용자 비밀번호 버전 확인 (12c 이상)
SELECT username, password_versions
FROM dba_users
WHERE username = 'SCOTT';
-- 결과 예시: 10G 11G 12C 가 모두 있어야 구버전 클라이언트와 호환됨
원인 2: 잘못된 자격 증명 확인 및 수정
사용자명이 실제로 데이터베이스에 존재하는지 확인합니다.
-- 사용자 존재 여부 및 상태 확인
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE username = UPPER('scott');
-- 결과 예시
-- USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE
-- -------- -------------- --------- -----------
-- SCOTT OPEN (null) 2025-12-31
비밀번호를 재설정해야 할 경우 DBA 권한으로 아래와 같이 실행합니다.
-- 비밀번호 재설정 (DBA 권한 필요)
ALTER USER scott IDENTIFIED BY "NewSecurePassword#2024";
-- 재설정 후 접속 테스트
CONNECT scott/"NewSecurePassword#2024"@orcl
원인 3: 계정 잠금 해제 및 비밀번호 만료 처리
-- 계정 상태 상세 확인
SELECT username,
account_status,
lock_date,
expiry_date,
profile
FROM dba_users
WHERE username = 'SCOTT';
-- 잠긴 계정 해제
ALTER USER scott ACCOUNT UNLOCK;
-- 만료된 비밀번호 재설정
ALTER USER scott IDENTIFIED BY "NewPassword#2024" ACCOUNT UNLOCK;
-- 프로파일의 비밀번호 정책 확인
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_name IN (
'FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME'
);
접속 자체가 안 될 때 sysdba로 우선 접속하는 방법
-- OS 인증을 통한 sysdba 접속 (서버 직접 접속 시)
sqlplus / as sysdba
-- sysdba로 접속 후 문제 계정 확인
SELECT username, account_status, lock_date
FROM dba_users
WHERE account_status != 'OPEN';
-- alert log에서 에러 확인 (경로는 환경마다 다름)
-- SHOW PARAMETER background_dump_dest;
예방 방법
1. 비밀번호 관리 정책 표준화 및 모니터링
애플리케이션 접속 계정의 비밀번호는 반드시 암호화된 Wallet이나 Vault 솔루션(Oracle Wallet, HashiCorp Vault 등)을 통해 관리하고, 소스코드나 설정 파일에 평문으로 비밀번호를 저장하지 않도록 합니다. 또한 계정 잠금이 발생하기 전에 사전 감지할 수 있도록 FAILED_LOGIN_ATTEMPTS 임계값에 근접하는 이벤트를 모니터링하는 DDL/로그인 트리거 또는 Oracle Unified Auditing을 설정해 두는 것이 좋습니다.
-- 로그인 실패 이벤트 감사 설정 (Unified Auditing, 12c 이상)
AUDIT POLICY ORA_LOGON_FAILURES;
-- 또는 전통적인 감사 설정
AUDIT SESSION WHENEVER NOT SUCCESSFUL;
2. 정기적인 계정 상태 점검 스크립트 운영
운영 환경에서는 계정 만료 30일 전에 미리 알림을 받을 수 있도록 모니터링 스크립트를 스케줄러(DBMS_SCHEDULER)에 등록하여 자동화합니다. 이를 통해 애플리케이션 장애로 이어지는 것을 사전에 방지할 수 있습니다.
-- 30일 이내 만료 예정 계정 조회 (정기 점검 스크립트)
SELECT username,
account_status,
expiry_date,
ROUND(expiry_date - SYSDATE) AS days_until_expiry
FROM dba_users
WHERE expiry_date IS NOT NULL
AND expiry_date BETWEEN SYSDATE AND SYSDATE + 30
AND account_status = 'OPEN'
ORDER BY expiry_date;
관련 에러
- ORA-28000:
the account is locked— 계정이 완전히 잠긴 상태로, ORA-01017과 함께 자주 발생합니다. ALTER USER … ACCOUNT UNLOCK으로 해결합니다. - ORA-28001:
the password has expired— 비밀번호 유효 기간이 만료된 경우로, 비밀번호 재설정이 필요합니다. - ORA-28002:
the password will expire within N days— 비밀번호 만료 경고로, 사전에 변경하지 않으면 ORA-01017로 이어질 수 있습니다. - ORA-01031:
insufficient privileges— 올바른 자격 증명이지만 권한이 부족한 경우 발생하며, ORA-01017과 혼동하지 않도록 주의합니다. - ORA-12154:
TNS:could not resolve the connect identifier specified— 접속 자체가 실패하는 경우로, 접속 문자열 설정을 함께 점검해야 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.