데이터베이스

[데이터베이스] .NET Framework 1.1에서 Oracle 11g + 19c를 동시에 연결한 방법 (ORA-28040 해결기)

투웨이코더 2026. 2. 16. 04:06

 

1. 문제 상황

레거시 환경(.NET Framework 1.1, VS2003)에서
두 개의 Oracle DB(11g, 19c)를 동시에 사용해야 했다.

 

사용 구조

 

  • System.Data.OracleClient
  • OCI DLL 직접 로딩
  • 32bit IIS 환경

19c 접속 시 다음 에러 발생

ORA-28040: No matching authentication protocol

 

 

2. 단순한 해결책이 통하지 않았던 이유

이전 글 참고

https://hyunolike.tistory.com/25

 

[CS] 왜 .NET은 Oracle Client가 필요했고 Spring은 필요 없을까? (feat. 닷넷, 스프링, 스프링부트)

“같은 Oracle DB를 쓰는데,왜 .NET에서는 항상 Oracle Client 설치 때문에 고생했고Spring에서는 JDBC 드라이버 하나로 끝났을까?” 1. 내가 이 질문을 하게 된 계기 레거시 .NET 시스템을 유지보수할 때마

hyunolike.tistory.com

 

 

  • tnsnames.ora 수정 → 실패
  • sqlnet.ora 수정 → 실패
  • DB 계정 변경 → 실패

이 문제는 “계정 문제”가 아니라
클라이언트-서버 인증 프로토콜 버전 불일치였다.

 

 

.NET 1.1 Oracle 연결 방식

System.Data.OracleClient
    ↓
OCI DLL
    ↓
Oracle Client
    ↓
Oracle DB

 

즉 실제 인증은 DB가 아니라
Oracle Client가 수행한다.

 

3. 해결 전략

 

전략 선택

“구형 클라이언트를 유지할 것인가?”
“신형 클라이언트로 통일할 것인가?”

 

Oracle Client 11.2.0.4 (32bit) 사용

 

  • 11g 최종 Patchset
  • 19c와 하위 호환 가능
  • 레거시 .NET 1.1과 완전 호환

 

4. 결과 구조

단일 클라이언트로 두 DB를 안정적으로 커버

5. 배운 점

  1. ORA-28040은 비밀번호 문제가 아니다.
  2. tnsnames.ora 문제도 아니다.
  3. 클라이언트 인증 프로토콜 버전이 핵심이다.
  4. 레거시 환경에서는 “업그레이드”보다 “호환 전략”이 중요하다.
단순한 DB 접속 오류로 보였지만 실제로는 애플리케이션이 사용하는 Oracle Client와 인증 프로토콜 버전 문제라는 걸 알게 되었고 레거시 환경에서는 코드보다 “환경과 의존성 구조”를 먼저 이해하는 게 중요하다는 걸 배웠습니다.

 

 

 


6. 번외. 핵심 용어 정리

6.1. OCI (Oracle Call Interface)

Oracle DB와 통신하기 위한 네이티브 C 기반 라이브러리

 

6.1.2. 구조

.NET → System.Data.OracleClient → OCI DLL → Oracle Client → Oracle DB

 

6.1.3. 특징

 

  • OS 레벨 DLL 로딩 필요
  • Oracle Client 설치 필수
  • 버전 의존성 매우 강함

.NET 1.1은 System.Data.OracleClient를 사용
→ 내부적으로 OCI DLL을 직접 호출
→ 결국 Oracle Client 버전에 종속됨

 

6.2 Oracle Client

Oracle DB에 접속하기 위한 클라이언트 소프트웨어 패키지

6.2.1. 구성

 

  • OCI DLL
  • SQL*Plus
  • tnsnames.ora
  • sqlnet.ora

DB 버전과 직접 통신하지 않음
Client가 인증 프로토콜을 처리

 

6.3. ORA-28040: No matching authentication protocol

클라이언트와 서버 간 인증 프로토콜 버전 불일치

6.3.1. 원인

 

  • DB는 19c
  • Client는 구버전 (예: 11.2.0.1)
  • 서버 보안 정책이 구버전 인증 차단

6.3.2. 해결 전략

 

  • Client를 상향 (11.2.0.4 이상)
  • 또는 서버 보안 정책 완화 (권장X)

6.4. Backward Compatibility (하위 호환성)

구형 클라이언트가 신형 DB와 통신 가능하도록 유지하는 정책

구형 Client (11.2.0.4)
        ↓
Oracle 11g  ✔
Oracle 19c ✔

 

 

 

 

6.5. System.Data.OracleClient

6.5.1. 특징

  • .NET Framework 기본 Oracle Provider
  • OCI 직접 의존
  • .NET 4 이후 Deprecated

6.5.2. 문제점

 

  • Oracle Client 설치 필수
  • 32bit/64bit 충돌 빈번
  • 환경 종속성 강함

6.6. TNS (Transparent Network Substrate)

tnsnames.ora 역할

Alias → HOST, PORT, SERVICE_NAME 매핑

aitkg_cert =
 (DESCRIPTION=
   (ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521))
   (CONNECT_DATA=(SERVICE_NAME=AITKG))
 )

 

 

 

6.7. sqlnet.ora

인증 및 네트워크 정책 설정 파일

SQLNET.AUTHENTICATION_SERVICES = (NTS)

 

7. 레거시 .NET vs Spring Boot 구조 비교

7.1. .NET 1.1 + OracleClient 구조

Application
   ↓
System.Data.OracleClient
   ↓
OCI DLL
   ↓
Oracle Client
   ↓
Oracle DB

특징

  • OS에 Oracle Client 필수 설치
  • DLL 경로 의존
  • PATH 환경변수 영향 받음
  • 32bit/64bit 충돌 위험
  • 인증 프로토콜 버전 영향 받음

 

7.2. Spring Boot + JDBC 구조

Application
   ↓
JDBC Driver (ojdbc8.jar)
   ↓
Oracle DB

 

특징

  • 별도 Oracle Client 설치 필요 없음
  • JDBC 드라이버가 인증 프로토콜 내장
  • JAR 교체로 버전 대응 가능
  • Docker 환경에서도 유연
  • 환경 종속성 낮음

7.3. 차이점

항목 .NET 1.1 Spring Boot
Oracle Client 설치 필수 불필요
OS 종속성 높음 낮음
인증 프로토콜 문제 자주 발생 거의 없음
버전 관리 환경 변수 영향 JAR 버전 교체
컨테이너 배포 어려움 쉬움