본문 바로가기

일상

ORA-28040 오류로 옛 JDBC 드라이버가 새 오라클에 접속하지 못할 때 (ojdbc14와 인증 프로토콜)

반응형

오래된 자바 프로젝트를 새 오라클 DB 에 붙였더니 ORA-28040: No matching authentication protocol 이 나며 접속이 안 되는 원인과, DB 버전별로 고치는 방법입니다.


로컬에 개발용 DB 를 새로 띄우면서 오래된 프로젝트 여러 개를 연결해 봤는데, 대부분은 잘 붙고 몇 개만 접속 단계에서 실패했습니다.


실패한 쪽의 공통점은 하나였습니다. 라이브러리 폴더에 ojdbc14.jar, 즉 아주 오래된 오라클 JDBC 드라이버가 들어 있었습니다.


- ORA-28040 은 드라이버와 DB 가 쓸 수 있는 로그인 방식이 겹치지 않아서 나는 오류다

- 12c ~ 19c 는 서버 설정으로 옛 방식을 다시 허용할 수 있다

- 21c 부터는 설정을 바꿔도 옛 드라이버로는 안 붙었다

- 근본 해결은 드라이버를 ojdbc8 로 교체하는 것이고, 코드는 거의 바뀌지 않는다


1. 증상

애플리케이션이 뜨면서 DB 커넥션을 만드는 순간 실패하고, 로그에는 이런 오류가 남습니다.



계정이나 비밀번호가 틀렸을 때 나는 오류와 다르고, 네트워크 문제도 아닙니다. 같은 계정으로 새 드라이버를 쓰는 다른 프로젝트는 멀쩡히 접속되니 헷갈리기 쉽습니다.


2. 원인: 로그인 방식이 서로 맞지 않는다

오라클은 로그인할 때 비밀번호를 그대로 보내지 않고, 정해진 방식으로 검증합니다. 이 방식이 버전마다 조금씩 강화돼 왔습니다.


ojdbc14 는 JDK 1.4 시절 드라이버라 아주 오래된 로그인 방식만 알고 있고, 새 DB 는 보안상 그 방식을 기본으로 받아주지 않습니다. 서로 공통으로 쓸 수 있는 방식이 없으니 "맞는 인증 프로토콜이 없다"는 오류가 나는 것입니다.


그래서 이 오류는 어느 한쪽이 고장 난 게 아니라 세대 차이입니다. 해결도 둘 중 하나를 상대에게 맞추는 방식이 됩니다.


3. 12c ~ 19c: 서버에서 옛 방식을 허용한다

DB 가 12c 에서 19c 사이라면 서버 설정으로 옛 로그인 방식을 다시 받아주게 할 수 있습니다. 검색하면 가장 많이 나오는 해결법이 이것입니다.



여기서 자주 빠뜨리는 게 비밀번호 재설정입니다. 설정만 바꾸면 기존 계정에는 옛 방식용 검증값이 없어서 여전히 실패하니, 설정을 바꾼 뒤 비밀번호를 한 번 다시 지정해야 합니다.


다만 이건 보안 수준을 일부러 낮추는 설정입니다. 로컬이나 테스트 DB 에서 임시로 쓰는 건 괜찮지만, 운영 DB 에 넣는 건 권하지 않습니다.


4. 21c 이후: 설정으로는 안 된다

21c 에서 같은 설정을 넣어봤는데 결과가 똑같았습니다. 오류 문구도 바뀌지 않았습니다.


21c 부터는 오래된 비밀번호 검증 방식 자체가 빠져서, 서버가 허용하고 싶어도 옛 드라이버가 알아듣는 방식을 더는 만들 수 없는 것으로 보입니다. 같은 DB 에 ojdbc6, ojdbc8 로는 전부 접속됐습니다.


- ojdbc14 : 21c 접속 실패 (설정 변경 후에도 동일)

- ojdbc6 / ojdbc8 : 21c 접속 정상

- ojdbc14 : 18c 에서는 접속 정상 (테스트한 개발용 이미지 기준, 서버 설정에 따라 다를 수 있음)


그래서 21c 이후로 올라간다면 드라이버 교체 말고는 길이 없다고 보는 게 맞습니다.


5. 근본 해결: 드라이버를 교체한다

JDBC 는 표준 인터페이스라서 드라이버 jar 만 바꿔도 코드는 거의 그대로 돌아갑니다. JDK 8 이상 환경이라면 ojdbc8 이 무난합니다.



교체할 때는 옛 jar 를 반드시 지워야 합니다. 둘이 같이 남아 있으면 어느 쪽이 먼저 로드될지 알 수 없어서, 바꿨는데도 증상이 그대로인 일이 생깁니다. 실제로 어떤 드라이버가 쓰이는지는 접속 후 드라이버 버전을 찍어보면 바로 확인됩니다.


다만 JDK 8 로 돌아가는 프로젝트에 JDK 1.4 용 드라이버가 남아 있다는 것 자체가 언젠가 정리해야 할 흔적이라, DB 를 21c 이후로 올릴 계획이 있다면 미리 바꿔두는 편이 편합니다.


6. 드라이버를 못 바꾸는 상황이라면

당장 소스를 건드릴 수 없는 사정이 있다면, 개발이나 테스트용 DB 를 19c 이하 버전으로 두는 것도 방법입니다.


저도 로컬 개발 DB 를 고를 때 21c 와 18c 를 같이 띄워 비교했는데, 옛 드라이버를 쓰는 프로젝트가 여러 개 있어서 18c 쪽을 골랐습니다. 운영 DB 도 그보다 낮은 버전이라 이 프로젝트들은 개발과 운영 양쪽에서 드라이버를 바꾸지 않고 그대로 돌아갑니다.


7. 정리

ORA-28040 은 DB 가 고장 난 게 아니라 드라이버와 DB 의 세대 차이가 드러난 것입니다.


- 원인은 로그인 방식이 서로 맞지 않아서다

- 12c ~ 19c 는 서버 설정 + 비밀번호 재설정으로 임시 해결할 수 있다

- 21c 이후는 설정으로 풀리지 않는다

- 근본 해결은 ojdbc8 등 새 드라이버로 교체, 옛 jar 는 반드시 삭제

- 당장 못 바꾸면 개발 DB 버전을 맞추는 것으로 시간을 번다


오래된 프로젝트를 새 DB 에 옮길 때 SQL 문법만 확인하고 끝내기 쉬운데, 그보다 먼저 접속 단계에서 막히는 드라이버가 없는지 라이브러리 폴더를 한 번 훑어보는 게 좋습니다.


여기까지 ORA-28040 과 옛 JDBC 드라이버 접속 문제에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형