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

ORA-28040
2026년 10월 05일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-28040 No matching authentication protocol 는?

ORA-28040 에러는 Oracle 클라이언트와 서버 간의 인증 프로토콜이 서로 호환되지 않을 때 발생하는 오류입니다. 주로 Oracle 데이터베이스 서버와 클라이언트의 버전 차이가 클 때, 특히 구버전 클라이언트(Oracle 11g 이하)가 신버전 서버(Oracle 12c 이상)에 접속을 시도할 경우 빈번하게 나타납니다. 이 에러는 보안 강화를 위해 Oracle 12c부터 기본 인증 방식이 변경되면서 하위 호환성 문제로 인해 운영 환경에서 자주 접하게 되는 대표적인 연결 오류 중 하나입니다.


주요 발생 원인

  • 클라이언트와 서버 간의 버전 불일치 (가장 흔한 원인)

Oracle 12c부터 기본 인증 알고리즘이 SHA-2 기반으로 강화되었으며, 이전 버전의 클라이언트는 이 새로운 인증 방식을 지원하지 않습니다. 예를 들어 Oracle 11g 클라이언트나 JDBC Thin 드라이버의 구버전이 Oracle 19c 서버에 접속하려 할 때 이 에러가 발생합니다. 특히 기업 환경에서 서버는 업그레이드하였으나 클라이언트(애플리케이션 서버, 개발 툴 등)를 함께 업그레이드하지 않은 경우 운영 중단 사태로 이어질 수 있어 주의가 필요합니다.

  • SQLNET.ORA 파일의 잘못된 파라미터 설정

Oracle 서버 측의 sqlnet.ora 파일에서 SQLNET.ALLOWED_LOGON_VERSION_SERVER 파라미터 값이 현재 사용 중인 클라이언트 버전보다 높게 설정되어 있을 경우 접속이 거부됩니다. 이 파라미터는 Oracle 12c에서 기본값이 12로 변경되었으며, 이는 Oracle 12c 미만의 클라이언트 인증 프로토콜은 기본적으로 허용하지 않겠다는 의미입니다. 잘못된 마이그레이션 설정이나 보안 정책 적용 과정에서 이 파라미터가 의도치 않게 높은 값으로 설정되는 경우가 실무에서 자주 발생합니다.

  • 패스워드 해시 버전 불일치 (10G 해시 미존재)

Oracle 12c 이상의 서버에서 계정이 생성되거나 패스워드가 변경된 경우, 기본적으로 새로운 방식의 해시(SHA-2)만 저장됩니다. 구버전 클라이언트는 10G 방식의 해시(DES 기반)를 필요로 하기 때문에, 서버에 해당 해시가 없으면 인증 자체가 불가능해집니다. SEC_CASE_SENSITIVE_LOGON 파라미터나 SQLNET.ALLOWED_LOGON_VERSION_SERVER 설정에 따라 10G 해시 생성 여부가 결정되므로, 계정 생성 시점의 서버 설정 상태가 매우 중요합니다.


해결 방법

방법 1: SQLNET.ALLOWED_LOGON_VERSION_SERVER 파라미터 조정

서버의 $ORACLE_HOME/network/admin/sqlnet.ora 파일에 아래 설정을 추가하거나 수정합니다.

-- sqlnet.ora 파일 설정 (파일 직접 편집)
-- 구버전 클라이언트(11g 이하) 허용 시
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 11
SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 11

-- 더 낮은 버전까지 허용이 필요한 경우 (보안 위험 존재, 임시 조치 권장)
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10
SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 10

> ⚠️ 이 설정은 보안 수준을 낮추는 임시 조치이므로, 근본적인 클라이언트 업그레이드와 병행해야 합니다.


방법 2: 10G 패스워드 해시 재생성

sqlnet.ora 설정 변경 후에는 반드시 해당 계정의 패스워드를 재설정하여 구버전 해시를 다시 생성해야 합니다.

-- DBA 권한으로 접속 후 패스워드 재설정
ALTER USER scott IDENTIFIED BY "NewPassword123";

-- 패스워드 해시 버전 확인 (10G 해시 존재 여부 확인)
SELECT username,
       password_versions
FROM   dba_users
WHERE  username = 'SCOTT';

-- 결과 예시 (10G 해시 포함 여부 확인)
-- USERNAME   PASSWORD_VERSIONS
-- ---------  -----------------
-- SCOTT      10G 11G 12C      <- 10G 해시가 포함되어야 구버전 클라이언트 접속 가능

방법 3: 현재 서버 설정 확인 및 진단

-- 현재 적용된 인증 버전 파라미터 확인
SHOW PARAMETER sec_case_sensitive_logon;

-- 전체 보안 관련 파라미터 확인
SELECT name, value
FROM   v$parameter
WHERE  name IN (
    'sec_case_sensitive_logon',
    'sec_max_failed_login_attempts'
);

-- 모든 사용자의 패스워드 버전 현황 조회 (운영 환경 전수 점검 시 유용)
SELECT username,
       account_status,
       password_versions,
       created,
       last_login
FROM   dba_users
WHERE  account_status = 'OPEN'
ORDER  BY username;

-- 10G 해시가 없는 계정만 필터링 (구버전 클라이언트 접속 불가 계정 식별)
SELECT username,
       password_versions
FROM   dba_users
WHERE  password_versions NOT LIKE '%10G%'
AND    account_status = 'OPEN'
ORDER  BY username;

방법 4: JDBC 드라이버 버전 업그레이드 (애플리케이션 서버 환경)

Java 애플리케이션에서 발생하는 경우, Oracle JDBC Thin 드라이버를 서버 버전에 맞게 업그레이드합니다.

-- 현재 Oracle 서버 버전 확인 (적합한 JDBC 드라이버 버전 결정에 활용)
SELECT * FROM v$version WHERE banner LIKE 'Oracle%';

-- 접속 중인 클라이언트 정보 확인 (DBA 권한 필요)
SELECT sid,
       username,
       program,
       machine,
       terminal
FROM   v$session
WHERE  username IS NOT NULL
AND    type = 'USER'
ORDER  BY logon_time DESC;

> Maven 또는 Gradle을 사용하는 경우 ojdbc8.jar (Oracle 12c 이상) 또는 ojdbc11.jar (Oracle 21c 이상)으로 의존성을 업데이트하세요.


예방 방법

  • 클라이언트-서버 버전 호환성 매트릭스 관리 및 업그레이드 계획 수립

Oracle 데이터베이스를 업그레이드하기 전에 반드시 모든 클라이언트(애플리케이션 서버, 개발 도구, 배치 프로그램, JDBC 드라이버 등)의 버전을 사전에 파악하고, Oracle 공식 지원 호환성 매트릭스(My Oracle Support)를 참조하여 호환 여부를 검증해야 합니다. 업그레이드 프로젝트 시 sqlnet.ora의 ALLOWED_LOGON_VERSION 파라미터를 마이그레이션 기간 동안 임시로 낮게 유지하고, 모든 클라이언트 업그레이드 완료 후 보안 강화 수준으로 상향 조정하는 단계별 접근이 권장됩니다.

  • 정기적인 계정 패스워드 버전 감사(Audit) 자동화

아래 쿼리를 활용하여 정기적으로(월 1회 이상) 구버전 해시만 보유한 계정을 식별하고, 패스워드를 재설정하는 관리 프로세스를 자동화하십시오. 이를 통해 신규 클라이언트 추가 또는 서버 업그레이드 시 발생할 수 있는 인증 오류를 사전에 예방할 수 있습니다.

-- 패스워드 버전 감사용 정기 점검 스크립트
SELECT username,
       account_status,
       password_versions,
       last_login,
       CASE
           WHEN password_versions LIKE '%12C%' THEN '최신 해시 보유'
           WHEN password_versions LIKE '%11G%' THEN '중간 버전 해시'
           WHEN password_versions LIKE '%10G%'
            AND password_versions NOT LIKE '%12C%' THEN '구버전 해시만 보유 (보안 위험)'
           ELSE '해시 없음 (외부 인증 또는 잠금 계정)'
       END AS hash_status
FROM   dba_users
WHERE  account_status = 'OPEN'
ORDER  BY username;

관련 에러

  • ORA-01017: invalid username/password; logon denied — 패스워드 재설정 후 잘못된 자격증명 입력 시 연이어 발생할 수 있습니다.
  • ORA-12638: Credential retrieval failed — OS 인증 설정 문제와 함께 발생하는 경우가 있으며, sqlnet.ora의 SQLNET.AUTHENTICATION_SERVICES 설정과 연관됩니다.
  • ORA-28041: Authentication protocol internal error — ORA-28040과 유사하게 인증 프로토콜 레벨에서 발생하는 내부 에러로, 패스워드 파일 손상 시 나타날 수 있습니다.
  • ORA-28000: the account is locked — 반복된 ORA-28040 접속 실패로 인해 계정이 잠기는 경우 연쇄적으로 발생할 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기