2026년 06월 26일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01005 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01005 null password given; logon denied 는?
ORA-01005 에러는 Oracle 데이터베이스에 접속을 시도할 때 패스워드가 NULL 값으로 전달되어 로그인이 거부되는 오류입니다. 단순히 패스워드를 입력하지 않은 경우뿐 아니라, 애플리케이션 코드나 접속 설정 파일에서 패스워드 값이 비어 있거나 제대로 전달되지 않을 때 발생합니다. 30년 현장 경험상 이 에러는 대부분 개발 환경 구성 미숙이나 운영 환경 배포 시 설정 누락에서 비롯되는 경우가 많습니다.
주요 발생 원인
1. 애플리케이션 접속 설정(Connection String)에서 패스워드 누락
가장 흔한 원인으로, JDBC, ODBC, OCI 등의 드라이버를 사용하는 애플리케이션에서 데이터베이스 접속 정보를 환경 변수나 설정 파일로 관리할 때 패스워드 항목이 비어 있거나 변수 치환이 실패하는 경우입니다. 특히 CI/CD 파이프라인이나 컨테이너 환경에서 Secret 값이 주입되지 않으면 이 오류가 빈번하게 발생합니다. 예를 들어 .env 파일에 DB_PASSWORD= 처럼 값이 없이 키만 선언된 경우가 대표적입니다.
2. 스크립트나 프로그램 코드 내 변수 초기화 오류
PL/SQL 또는 Shell 스크립트, Python, Java 등의 애플리케이션 코드에서 패스워드를 담는 변수가 선언은 되었지만 실제 값이 할당되지 않은 채로 접속 함수에 전달되는 경우입니다. 특히 조건 분기 로직에서 특정 경로로 실행될 때 패스워드 변수가 초기화되지 않는 버그가 숨어있는 경우가 실무에서 종종 발견됩니다. 이런 문제는 단위 테스트 없이 운영에 배포되었을 때 큰 장애로 이어질 수 있습니다.
3. Oracle Wallet 또는 외부 인증(External Authentication) 설정 오류
Oracle Wallet이나 LDAP, Kerberos 등의 외부 인증 메커니즘을 사용하면서 관련 설정이 완전하지 않을 때 패스워드가 NULL로 인식되어 ORA-01005가 발생하기도 합니다. sqlnet.ora, tnsnames.ora 등의 네트워크 설정 파일에서 Wallet 경로가 잘못 지정되거나, 외부 인증 관련 파라미터가 누락된 경우 데이터베이스 서버가 패스워드를 받지 못하는 상황이 생깁니다. 특히 SQLNET.AUTHENTICATION_SERVICES 설정이 잘못되면 이 문제가 자주 발생합니다.
해결 방법
원인 1 해결: 접속 문자열 및 설정 파일 점검
먼저 접속에 사용되는 패스워드 값이 실제로 전달되는지 확인합니다. SQL*Plus로 직접 테스트하여 패스워드 자체의 문제인지 파악하는 것이 우선입니다.
-- SQL*Plus 직접 접속 테스트 (패스워드 직접 입력)
CONNECT scott/tiger@ORCL
-- 패스워드 없이 접속 시도 시 ORA-01005 발생 예시
-- CONNECT scott/@ORCL -- 이 경우 에러 발생
-- 현재 접속된 세션 및 사용자 확인
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') AS current_user,
SYS_CONTEXT('USERENV', 'DB_NAME') AS db_name
FROM DUAL;
JDBC 접속 설정 예시 (올바른 방법):
-- Oracle DB Link 생성 시 패스워드 명시 (DB Link 패스워드 누락 방지)
CREATE DATABASE LINK my_dblink
CONNECT TO remote_user IDENTIFIED BY "mySecureP@ss123"
USING 'REMOTE_DB';
-- DB Link 접속 테스트
SELECT * FROM dual@my_dblink;
원인 2 해결: 사용자 패스워드 재설정 및 계정 상태 확인
접속 계정 자체의 상태와 패스워드를 확인하고 필요 시 재설정합니다.
-- DBA 권한으로 사용자 계정 상태 확인
SELECT username,
account_status,
lock_date,
expiry_date,
password_versions
FROM dba_users
WHERE username = 'SCOTT';
-- 패스워드 재설정 (대소문자 구분 주의)
ALTER USER scott IDENTIFIED BY "NewSecureP@ss2024";
-- 패스워드 만료 여부 확인 및 만료 해제
ALTER USER scott ACCOUNT UNLOCK;
ALTER USER scott PASSWORD EXPIRE; -- 필요 시 다음 로그인 시 변경 강제
-- 패스워드 정책(Profile) 확인
SELECT username, profile FROM dba_users WHERE username = 'SCOTT';
SELECT resource_name,
limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_type = 'PASSWORD';
원인 3 해결: Oracle Wallet 및 외부 인증 설정 점검
-- sqlnet.ora 설정 확인을 위한 파라미터 조회
-- (SQL*Plus에서 확인)
SHOW PARAMETER sqlnet
-- Wallet 상태 확인 (mkstore 명령어 예시 - OS 레벨)
-- mkstore -wrl /oracle/wallet -listCredential
-- 외부 인증 사용자 생성 예시 (OS 인증)
CREATE USER ops$oracle IDENTIFIED EXTERNALLY;
GRANT CREATE SESSION TO ops$oracle;
-- sqlnet.ora에서 인증 서비스 설정 확인 쿼리
-- (아래는 설정 예시이며 실제 파일에서 수정)
-- SQLNET.AUTHENTICATION_SERVICES = (NTS) -- Windows OS 인증
-- SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCP) -- 일반 설정
-- 현재 인증 관련 파라미터 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('os_authent_prefix',
'remote_os_authent',
'sec_case_sensitive_logon');
접속 시도 로그 분석
-- 실패한 로그인 시도 감사 (Audit 활성화된 경우)
SELECT os_username,
username,
userhost,
timestamp,
action_name,
returncode
FROM dba_audit_session
WHERE returncode = 1005
ORDER BY timestamp DESC
FETCH FIRST 20 ROWS ONLY;
-- 또는 Unified Auditing 사용 환경
SELECT dbusername,
os_username,
userhost,
event_timestamp,
action_name,
return_code
FROM unified_audit_trail
WHERE return_code = 1005
ORDER BY event_timestamp DESC
FETCH FIRST 20 ROWS ONLY;
예방 방법
1. 접속 정보 관리를 Oracle Wallet 또는 Secret Manager로 일원화
패스워드를 코드나 설정 파일에 평문으로 저장하지 않고, Oracle Wallet(mkstore)이나 HashiCorp Vault, AWS Secrets Manager 같은 시크릿 관리 도구를 사용하여 중앙에서 관리하는 습관을 들여야 합니다. 이렇게 하면 패스워드 누락이나 오타로 인한 ORA-01005 발생을 원천 차단할 수 있습니다. 애플리케이션 배포 전 반드시 접속 정보가 올바르게 주입되었는지 검증하는 스크립트를 CI/CD 파이프라인에 포함시키는 것을 권장합니다.
-- Oracle Wallet 사용 접속 예시 (패스워드 없이 Wallet으로 인증)
-- tnsnames.ora 또는 sqlnet.ora에 Wallet 경로 설정 후
-- CONNECT /@ORCL -- Wallet에 저장된 자격증명으로 자동 인증
2. 데이터베이스 접속 감사(Audit) 설정으로 이상 접속 조기 탐지
ORA-01005를 포함한 로그인 실패 이벤트를 감사 설정으로 기록하여 이상 징후를 빠르게 파악하고 대응할 수 있는 체계를 갖추어야 합니다. Unified Auditing 기능을 활용하면 실패한 접속 시도를 실시간으로 모니터링할 수 있으며, 이를 통해 설정 오류뿐 아니라 보안 위협도 동시에 탐지할 수 있습니다.
-- Unified Audit Policy 생성: 로그인 실패 감사
CREATE AUDIT POLICY audit_failed_logins
ACTIONS LOGON
WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') IS NOT NULL'
EVALUATE PER SESSION;
-- 더 간단한 방법: 기본 실패 로그인 감사 활성화
AUDIT CREATE SESSION WHENEVER NOT SUCCESSFUL;
-- 감사 결과 확인
SELECT username,
action_name,
returncode,
timestamp
FROM dba_audit_trail
WHERE returncode != 0
ORDER BY timestamp DESC;
관련 에러
- ORA-01017:
invalid username/password; logon denied— 사용자명 또는 패스워드가 틀린 경우 발생하며, ORA-01005와 함께 로그인 실패의 양대 산맥입니다. ORA-01005는 패스워드 자체가 NULL인 반면, ORA-01017은 값은 있지만 틀린 경우입니다. - ORA-28000:
the account is locked— 반복적인 로그인 실패(ORA-01005, ORA-01017 포함)로 인해 계정이 잠기면 발생합니다. - ORA-28001:
the password has expired— 패스워드 만료 정책에 의해 패스워드가 만료된 경우로, 이 상태를 제대로 처리하지 않으면 ORA-01005로 이어질 수 있습니다. - ORA-12154:
TNS:could not resolve the connect identifier specified— 접속 설정 자체가 잘못된 경우로, 간혹 ORA-01005와 혼동될 수 있는 네트워크 레벨 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.