2026년 07월 01일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01040 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01040 invalid character in password; logon denied 는?
ORA-01040 에러는 Oracle 데이터베이스에 로그인을 시도할 때 비밀번호에 허용되지 않는 특수문자가 포함되어 있거나, 비밀번호 문자열이 Oracle 내부적으로 올바르게 파싱되지 않을 경우 발생하는 인증 거부 에러입니다. 주로 애플리케이션 접속 문자열(Connection String) 내에 특수문자가 이스케이프(Escape) 처리 없이 포함되어 있거나, SQL*Plus 또는 외부 툴에서 비밀번호를 입력할 때 잘못된 방식으로 따옴표 처리가 된 경우에 자주 발생합니다. 이 에러는 보안 정책 강화로 인해 복잡한 비밀번호를 사용하는 환경에서 더욱 빈번하게 나타나며, 개발자와 DBA 모두가 반드시 이해하고 있어야 하는 중요한 에러입니다.
주요 발생 원인
1. 비밀번호에 Oracle이 허용하지 않는 특수문자 포함
Oracle 버전에 따라 비밀번호에 사용할 수 있는 특수문자의 범위가 다릅니다. 특히 @, /, ", \ 등의 문자는 Oracle 내부 파싱 과정에서 구분자(Delimiter)로 인식될 수 있어, 따옴표 처리 없이 사용하면 ORA-01040이 발생합니다. 예를 들어 비밀번호가 P@ss/word#1 처럼 @나 /를 포함할 경우, Oracle이 이를 TNS 접속 문자열의 일부로 잘못 해석하여 로그인이 거부됩니다.
2. SQL*Plus 또는 접속 도구에서의 따옴표 처리 오류
SQL*Plus에서 비밀번호를 입력할 때 특수문자가 포함된 경우 반드시 큰따옴표(")로 감싸야 합니다. 따옴표 없이 특수문자가 포함된 비밀번호를 입력하면 Oracle 클라이언트가 비밀번호를 올바르게 파싱하지 못하고, 잘못된 문자로 판단하여 인증 자체를 거부합니다. 이는 특히 운영 자동화 스크립트나 배치 작업에서 비밀번호를 하드코딩할 때 흔히 발생하는 실수입니다.
3. JDBC, ODBC 등 드라이버 또는 애플리케이션 접속 문자열 문제
Java 애플리케이션에서 JDBC URL 또는 Properties 객체로 비밀번호를 전달할 때, 특수문자가 URL 인코딩 없이 포함되면 드라이버 내부에서 비밀번호가 변형되거나 잘려나갈 수 있습니다. 이 경우 실제 Oracle 서버에는 의도하지 않은 형태의 비밀번호가 전달되므로 ORA-01040이 발생하게 됩니다. ODBC DSN 설정 파일에서도 마찬가지로 특수문자 이스케이프 처리를 빠뜨리는 경우가 많습니다.
해결 방법
원인 1 해결: SQL*Plus 접속 시 큰따옴표로 비밀번호 감싸기
특수문자가 포함된 비밀번호로 SQL*Plus 접속 시, 반드시 비밀번호를 큰따옴표로 감싸야 합니다.
-- 잘못된 방법 (ORA-01040 발생 가능)
sqlplus scott/P@ss/word#1@ORCL
-- 올바른 방법: 큰따옴표로 비밀번호 감싸기
sqlplus scott/"P@ss/word#1"@ORCL
-- SQL*Plus 프롬프트에서 직접 입력하는 방법
sqlplus /nolog
SQL> connect scott/"P@ss/word#1"@ORCL
원인 2 해결: 비밀번호 변경 시 따옴표 처리
특수문자가 포함된 비밀번호를 ALTER USER로 변경할 때도 큰따옴표가 필요합니다.
-- 비밀번호에 특수문자 포함 시 큰따옴표 사용
ALTER USER scott IDENTIFIED BY "NewP@ss#2024!";
-- 변경 후 접속 테스트
CONNECT scott/"NewP@ss#2024!"@ORCL
-- 현재 사용자의 비밀번호 만료 여부 확인
SELECT username, account_status, expiry_date
FROM dba_users
WHERE username = 'SCOTT';
원인 3 해결: JDBC 접속 시 Properties 객체 사용
JDBC URL에 직접 비밀번호를 넣는 대신, Properties 객체를 활용하면 특수문자 문제를 안전하게 우회할 수 있습니다.
-- Oracle DB에서 테스트 계정 생성 예시 (특수문자 포함 비밀번호)
CREATE USER app_user IDENTIFIED BY "App@User#2024";
GRANT CONNECT, RESOURCE TO app_user;
-- 접속 문자열 테스트 (SQL*Plus)
CONNECT app_user/"App@User#2024"@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))
// Java JDBC에서 올바른 방법: Properties 객체 사용
Properties props = new Properties();
props.setProperty("user", "app_user");
props.setProperty("password", "App@User#2024"); // 특수문자 그대로 전달 가능
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:ORCL", props
);
원인 4 해결: 비밀번호 정책 확인 및 특수문자 제한 검토
-- Oracle 12c 이상: 비밀번호 검증 함수 확인
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION'
ORDER BY profile;
-- 특정 프로파일의 모든 비밀번호 정책 확인
SELECT resource_name, limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_type = 'PASSWORD';
-- 필요 시 비밀번호 검증 함수 비활성화 (테스트 환경 한정)
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;
-- 사용자 프로파일 확인
SELECT username, profile
FROM dba_users
WHERE username = 'APP_USER';
예방 방법
1. 비밀번호 명명 규칙(Naming Convention) 표준화 및 문서화
조직 내 Oracle 비밀번호 정책을 수립할 때, 특수문자 사용 범위를 명확하게 제한하고 문서화하는 것이 중요합니다. @, /, \, " 등 Oracle 파싱에 영향을 줄 수 있는 문자를 비밀번호에 사용하지 않도록 가이드라인을 만들고, 신규 계정 생성 및 비밀번호 변경 절차서에 반드시 포함시켜야 합니다. 허용되는 특수문자 목록(예: !, #, $, %, ^, &, *, (, ), _, -, +, =)을 사전에 정의하고, 비밀번호 변경 스크립트에서 이를 자동으로 검증하는 로직을 추가하는 것이 Best Practice입니다.
2. 애플리케이션 접속 테스트 자동화 및 Wallet/Vault 활용
비밀번호가 변경될 때마다 애플리케이션 접속을 자동으로 검증하는 테스트 파이프라인을 구축하여, ORA-01040 같은 인증 오류를 배포 전 단계에서 조기에 발견해야 합니다. 또한 Oracle Wallet이나 HashiCorp Vault 같은 시크릿 관리 솔루션을 도입하면, 비밀번호를 접속 문자열에 직접 하드코딩할 필요가 없어져 특수문자 이스케이프 문제 자체를 근본적으로 차단할 수 있습니다.
-- Oracle Wallet 사용 예시: mkstore로 자격증명 저장 후 /@alias 형태로 접속
-- 이렇게 하면 비밀번호를 접속 문자열에 노출하지 않아도 됨
-- (운영체제 명령어 예시, SQL이 아님)
-- mkstore -wrl /oracle/wallet -createCredential ORCL app_user "App@User#2024"
-- sqlplus /@ORCL <-- 비밀번호 없이 안전하게 접속
관련 에러
- ORA-01017:
invalid username/password; logon denied— 사용자명 또는 비밀번호 자체가 틀렸을 때 발생하며, ORA-01040과 유사한 상황에서 혼동하기 쉽습니다. ORA-01040은 비밀번호의 문자 자체가 문제인 반면, ORA-01017은 자격증명이 틀린 경우입니다. - ORA-28000:
the account is locked— 잘못된 비밀번호로 반복 로그인 시도 후 계정이 잠길 때 발생합니다. ORA-01040으로 인한 반복 실패가 ORA-28000을 유발할 수 있습니다. - ORA-28001:
the password has expired— 비밀번호 유효기간이 만료된 경우 발생하며, 비밀번호 변경 과정에서 특수문자 처리 실수로 ORA-01040이 이어서 발생하는 패턴이 실무에서 자주 관찰됩니다. - ORA-12154:
TNS:could not resolve the connect identifier specified— 접속 문자열에서 특수문자로 인해 TNS 파싱 자체가 실패할 경우 ORA-01040 대신 이 에러가 먼저 나타나기도 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.