
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. 배운 점
- ORA-28040은 비밀번호 문제가 아니다.
- tnsnames.ora 문제도 아니다.
- 클라이언트 인증 프로토콜 버전이 핵심이다.
- 레거시 환경에서는 “업그레이드”보다 “호환 전략”이 중요하다.
단순한 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 버전 교체 |
| 컨테이너 배포 | 어려움 | 쉬움 |
'데이터베이스' 카테고리의 다른 글
| [DB] PL/SQL 이용해 여러 테이블을 안전하게 삭제해보자 (0) | 2025.11.22 |
|---|