mysql 서버에 접속하려고 할 때, Not Supported 라는 메시지와 함께 연결 오류가 발생했다.
에러 발생 위치가 명확했고, 코드도 간결했기에, 원인을 파악하기는 쉬웠다.
/src/auth.ts | mysql@v2.7.0 | Deno
위 코드 블럭을 살펴 보면, auth plugin이 mysql_native_password가 아니라서 발생한 문제라는 것을 알 수 있다.
이 인증 타입은 처음 보는 개념이라, 가볍게 살펴본 결과,
mysql_native_password 에서, cache_sha2_password 로 넘어가는 추세로 보인다.
mysql 8.0부터는 default가 cache_sha2_password 라고 한다.
사용중인 저 deno mysql library 도 버전을 올리면, cache_sha2_password 를 지원한다.
하지만 deno typeorm 에서 사용중인 deno mysql은 2.7.0 이었기에.. 쉽게 건드릴 수가 없었다.
그래서, 이제 유저의 인증 시의 auth plugin을 변경해 주었다.
해당 DB의 유저 및 인증 정보 목록은 다음 쿼리를 통해 확인할 수 있다.
SELECT user, host, plugin FROM mysql.user;
위 이미지처럼 결과를 확인할 수 있다.
그래서 이제 접속할 유저 인증 정보를 변경하여, mysql_native_password 로 설정해 주었으니...
잘 되겠지! 하고 접속해 보았으나,
문제는 동일했다.
에러 콜스택을 위주로 라이브러리를 천천히 설펴보니,
이 인증 플러그인은 handshake 패킷으로부터 가져와진다.
handshake는 위처럼 정의되어 있고,
MySQL: Connection Phase
The Connection Phase performs these tasks: exchange the capabilities of client and server setup SSL communication channel if requested authenticate the client against the server It starts with the client connect()ing to the server which may send a ERR pack
dev.mysql.com
이처럼 최초 connection 맺을 때 auth plugin을 서로 조율한 뒤 인증을 거치게 된다.
handshake 할 때 전달되는 auth plugin은,
해당 유저가 사용하는 auth plugin이 아니라,
해당 DB의 default_authentication_plugin 이었다.
(최소한 사용중인 deno mysql 은 그렇다)
위 값은 다음 쿼리로 확인이 가능하다.
SHOW VARIABLES LIKE 'default_authentication_plugin';
따라서, 이를 변경해주기 위해서는
mysql 실행 시에 `--default-authentication-plugin=mysql_native_password` 인자를 주어야 한다.
Aurora 로 DB를 띄웠을 때는 전혀 문제가 없었어서, 왜그럴까 확인해 보았는데,
오로라의 mysql 8.0 default parameter 에 이 설정 값이 이미 들어가 있었다!
새로운 mysql handshake 를 구경해볼 수 있는 기회여서 재밌던 이슈였다.
'연구한 이야기 > 문제 해결 이야기' 카테고리의 다른 글
MySQL 통신 패킷 확인하기 (0) | 2024.06.23 |
---|---|
클라이언트 IP를 '잘' 가져오자 (0) | 2024.04.21 |
서버 로그가 누락되고 있어요..! (0) | 2024.03.31 |
alpine리눅스와 stat (0) | 2024.03.24 |
mysql connect 시에 timezone 관련해서 에러가 나요! (2) | 2024.03.02 |