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는 위처럼 정의되어 있고,
이처럼 최초 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 |