PHP

[PHP] PDO caching_sha2_password 접속 문제 해결하기

PHP의 PDO(PHP Data Objects) 기능을 사용하여 데이터베이스를 사용하고자 할 때 주로 다음과 같은 PHP 코드를 사용합니다.

try {
    $db_conn = new PDO("mysql:host=localhost;dbname=mydatabase;charset=utf8", "username", "password");
}
catch (PDOException $e) {
    echo "데이터베이스 연결 에러! : " . $e;
}

 

그런데 다음과 같이 PDOException 에러가 발생하며 데이터베이스 서버에 접속되지 않는 경우가 있습니다.

PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]

이는 웹 서버에서 접속을 요청한 데이터베이스 서버에서 MySQL Server 8.0 버전 이상을 사용할 때에 나타나는 문제입니다. MySQL Server 5.7 버전을 사용하다가 업그레이드 된 MySQL을 설치하게되면서 예전에는 없었던 문제가 나온 것이기도 합니다. php의 데이터베이스를 연결하는 함수에서 MySQL 8.0의 최신 인증 기술인 caching_sha2 인증을 지원하지 않아서 발생하는 것입니다.

 

PHP PDO caching_sha2_password 문제 해결


이 문제를 해결하려면 php가 MySQL Server 8.0을 제대로 지원해주는 방안이 나올 때 까지 MySQL Server를 5.7 이하 버전으로 유지하는 것이 좋을 듯 싶습니다.

만약 그래도 MySQL Server 8.0을 계속 사용해야 한다면, 현재 데이터베이스 서버에서 사용 중인 사용자 인증 기능을 기존의 인증 방식(MySQL Native Password Authentication)으로 바꾸는 방법이 있습니다. (이 방법은 PHP 공식 문서인 다음 경로에서도 설명되어 있습니다 : https://www.php.net/manual/en/ref.pdo-mysql.php)

 

먼저 MySQL Server의 주요 설정 파일인 my.cnf을 열어줍니다. 리눅스 기준 /etc/my.cnf 파일을 텍스트 에디터를 사용하여 열어주면 됩니다.

이후 [mysqld] 항목을 찾습니다. 여기의 아랫 부분에 다음과 같은 옵션값을 넣어줍니다.

default_authentication_plugin= mysql_native_password

수정하면 다음과 같을 것입니다.

 

완료되었다면 파일을 저장하고 빠져나와줍니다.

다음으로 해야 할 것은 현재 사용 중인 사용자 계정의 암호를 모두 바꾸어 주는 것입니다. 관리자 계정을 포함하여 직접 생성한 모든 계정을 미리 찾아둡니다.

먼저 root 계정의 암호를 변경해보도록 하겠습니다. 리눅스에서는 콘솔 환경에서, 윈도우 기준 cmd에서 명령어를 입력하여 mysql 데이터베이스에 접속합니다.

mysql -uroot -p
Enter password: <root 계정의 암호 입력>

 

이후 다음 쿼리문을 실행합니다. 여기서 주의할 점은 기존에 유저를 생성할 때 입력한 쿼리인 IDENTIFIED BY가 아닌 IDENTIFIED WITH mysql_native_password로 입력해주어야 합니다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';

 

그 다음으로, 별도로 생성한 일반 사용자가 있다면 해당 사용자에 대한 계정도 아래와 같이 변경해줍니다.

ALTER USER '[사용자명]'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';

 

만약 이후에 사용자를 생성하게 될 경우에는 다음과 같이 IDENTIFIED WITH mysql_native_password BY를 사용해주면 됩니다. 그렇지만 위에서 설정했듯이 기본 값으로 이미 mysql native password를 사용하기 때문에 기존 방식대로 사용자를 생성해도 무방합니다.

CREATE USER '[사용자명]'@'localhost' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';

 

암호 변경이 완료되었다면 잠시 데이터베이스 서버의 연결을 끊어주겠습니다. (exit 입력)

이제 MySQL Server의 서비스를 다시 시작해주어야 합니다. 리눅스를 기준으로 다음 명령어로 서비스를 다시 시작해줍니다. (프로그램 및 운영체제에 따라 서비스 이름이 mysqld 이거나 mysql 일 수 있습니다. 이 방법을 모른다면 호스팅 및 서버 관리자에게 문의해보셔야 합니다.)

[root@localhost ~]# service mysqld restart

 

만약 systemd를 사용 중이라면 다음과 같이도 사용 가능합니다.

[root@localhost ~]# systemctl restart mysqld.service

MySQL 서버가 재시작되었다면, 다시 한 번 PHP PDO의 접속 코드가 사용 된 페이지에 접속하고 문제가 발생하는지 확인해보세요.

별다른 문제가 없다면 에러 메세지가 사라지고 문제 없이 서버에 연결 되어 있을 것입니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1개월 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

7개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

9개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

9개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

9개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

9개월 ago