grep

Backend

MySQL 인증 플러그인 caching_sha2_password에 대한 이해

yum.jung카카오

2025년 7월 17일

원문에서 보기 ↗

개요

MySQL 접근에 대한 안정성을 높이기 위해 MySQL Ver. 5.7.23부터 MySQL 계정의 비밀번호 인증을 위한 알고리즘 플러그인으로 caching_sha2_password가 도입되었습니다. 도입 시에는 기본 인증 플러그인이 아니었기 때문에 원하는 사람만 선택하여 사용할 수 있었습니다. 하지만, MySQL Ver. 8.0.x 버전부터 기본 인증 플러그인 값이 caching_sha2_password로 변경되었고, MySQL Ver. 9.0 부터는 mysql_native_password가 지원되지 않는 것으로 결정되었습니다. 이에 따라 기존에 mysql_native_password를 사용하는 경우 caching_sha2_password로 변경해야 하며, MySQL 운영 시 어떤 부분들이 영향을 미칠지에 대한 고민도 필요해 졌습니다.

여기에서는 caching_sha2_password 플러그인 도입을 위해 필요한 사전 지식을 소개하고, 변경 및 운영 시 어떤 내용들을 반영해야 하는지를 정리해 보려고 합니다.

1. Hash 암호화 알고리즘에 대한 기본 지식

caching_sha2_password 플러그인은 SHA-256 알고리즘을 기반으로 작성된 인증 플러그인입니다. 그래서 먼저 여기서는 간단하게 Hash 알고리즘에 대해 정리해 보려고 합니다.

SHA_256 알고리즘은 Hash 알고리즘 중 하나입니다. Hash 알고리즘은 단방향 알고리즘으로 속도가 빠르지만, 복호화는 불가능합니다. Hash 알고리즘은 변환/계산할 때 쓰이는 MD5, SHA1, SHA256, SHA384, SHA512 등의 알고리즘이 있습니다. 이 중 몇 개만 간단히 짚어 보고 가겠습니다.

1.1 MD5

MD5는 Message-Digest Algorithm5의 약자로 임의의 길이의 데이터를 고정된 비트 128비트를 기반으로 Hash로 변환하는 단방향 해시 함수입니다. 메시지 축약 알고리즘으로 많이 사용되며, 프로그램이나 파일이 원본 그대로 인지를 확인하는 무결성 검사 등에 많이 사용됩니다. 간단히 다음과 같은 특징을 가지고 있습니다.

MySQL에서는 다음과 같이 간단히 암호화 할 수 있습니다.

> SELECT MD5('yumi')
+----------------------------------+
| MD5('yumi')                      |
+----------------------------------+
| d9de1908c30cb3c073fd1ba610ce077d |
+----------------------------------+

1.2 SHA(Secure Hash Algorithm)

SHA 알고리즘은 미국 국가표준기술연구소(NIST)에서 발행한 암호학적 해시 함수군으로 다음과 같은 특징을 가지고 있습니다.

위와 같은 특징을 가진 SHA는 시간이 지남에 따라 보안 취약점이 발견되면서 여러 버전으로 발전했고, SHA-1부터 현재 SHA-3까지 발전했지만, SHA-1은 현재 사용이 권장되지 않아, 이제 사용하지 않는다고 봐도 무방합니다. 현재는 SHA-2가 널리 사용되고 있고, SHA-2, SHA-3을 사용하는 것을 권장합니다.

3개의 알고리즘을 비교하면 다음과 같이 간단히 정리해 볼 수 있습니다.

SHA-1SHA-2SHA-3
발표 연도1995년2001년2015년
출력 해시 길이160비트224, 256, 384, 512비트224, 256, 384, 512비트
기반 알고리즘MD4 기반의 Merkle-DamgardMerkle-Damgård (Davies-Meyer)Keccak (스펀지 구조)
보안성취약 (충돌 공격)안전 (길이 확장 공격 취약점 존재)안전 (길이 확장 공격 저항성)
권장 여부사용 금지/비권장현재 널리 사용 및 권장새로운 표준, 점진적 도입
주요 용도(과거) 데이터 무결성, 디지털 서명데이터 무결성, 디지털 서명, 블록체인, SSL/TLS차세대 보안 애플리케이션, 다양성 확보

현재 MySQL에서 사용하는 caching_sha2_password 인증 플러그인은 SHA-2 기반으로 만들어진 알고리즘을 사용하여 개발되었습니다. 여기에서는 MySQL 비밀번호 암호화에 사용하는 SHA-2만 간단히 살펴보겠습니다.

1.2.1 SHA-2

SHA-1의 보안 취약점을 보완한 알고리즘으로 다음과 같은 내용이 보강되었습니다.

SHA-2는 앞서 이야기 한대로 현재 가장 일반적으로 사용되고 많이 사용되는 암호화 알고리즘으로 다양한 디지털 보안 애플리케이션에서 핵심적인 역할을 수행합니다.

SHA-2는 생성되는 해시값의 길이 및 변형 기술에 따라 SHA-224, SHA-256, SHA-384, SHA-512 제품군을 가지고 있습니다. 이 중 SHA-256, SHA-512를 가장 많이 사용합니다. MySQL에서는 SHA-256을 기반으로 인증 플러그인을 만들어서 제공합니다.

2. MySQL 인증 플러그인 히스토리

MySQL은 버전에 따라 다양한 인증 플러그인을 제공했습니다. 여기에서는 간단히 버전에 따라 어떤 플러그인이 사용되었는지 정리하겠습니다.

MySQL은 default_authentication_plugin 시스템 변수를 통해 기본 사용 가능한 플러그인을 설정해 사용할 수 있습니다. 버전에 따른 기본 인증 플러그인은 다음과 같습니다.

MySQL에서 제공한 인증 플러그인 중 주요한 플러그인 몇개만 간단히 살펴보도록 하겠습니다.

[mysql_old_password]

mysql_old_password 인증 플러그인은 다른 암호화 기술을 사용하지 않고, 자체적으로 해시 알고리즘을 만들어서 제공한 인증 플러그인입니다. 비밀번호 문자열을 기반으로 특정 비트 연산과 같은 간단한 변환을 여러번 수행하는 상대적으로 단순한 알고리즘으로 구현되었습니다. 또한, 생성되는 해시값은 16자리 16진수 문자열(8바이트)로 변환됩니다.

[mysql_native_password]

SHA-1알고리즘을 사용하여 구현한 인증 플러그인입니다. 입력된 비밀번호를 SHA-1 알고리즘으로 2번 해싱해 최종 저장될 해시값을 생성합니다. 이 값을 40자리 16진수 문자열로 변환하고, 앞에 * 문자를 추가하여 총 41자로 해시값을 저장합니다. 변환된 비밀번호의 해시값은 mysql.user 테이블의 authentication_string 컬럼에 저장하고, 클라이언트 접근 시 클라이언트가 제공한 비밀번호를 변환해 비교하는 방식으로 구현했습니다.

mysql_native_password 플러그인은 MySQL Ver. 5.6~5.7까지 기본으로 설정되는 인증 플러그인이었습니다. MySQL Ver. 8.0부터는 기본으로 설정되는 인증 플러그인은 아니지만, 원하면 설정을 변경하여 사용할 수는 있습니다.

[sha256_password]

SHA-256을 기반으로 구현한 인증 플러그인입니다. 비밀번호 문자열과 솔트(Salt)값을 사용하고, 여러 변환 과정을 거쳐 해시값을 만들어냅니다. 솔트값은 랜덤값을 추출하는 함수를 사용하여 만들고, 이 값을 이용하여 변환하면 같은 비밀번호 문자열이라 할지라도 다른 Hash 값을 만들어 내도록 하여 보안성을 높였습니다. 최종적으로 생성되는 해시값은 32바이트(256비트)값이지만, 저장할 때에는 최종 해시값과 사용한 솔트값을 같이 저장하기 위해 추가적인 인코딩 작업 후에 저장됩니다. 이 알고리즘도 만들어진 최종 값을 mysql.user 테이블의 authentication_string 컬럼에 저장합니다.

클라이언트가 접근을 시도하게 되면, authentication_string에서 솔트값을 확인하고 그 값으로 접속 시 전달받은 비밀번호를 변환합니다. 그리고, 그 값을 authentication_string에서 추출한 해시값과 비교하여 접근 가능 여부를 확인합니다.

MySQL 접속 시 sha256_password 인증 방식을 사용하게 되면 해당 연결은 SSL/TLS를 통한 연결 또는 RSA 연결만 가능하게 됩니다.

[ 솔트(Salt)란? ]

비밀번호를 해시하여 저장할 때 추가되는 암호학적으로 안전한 임의의 바이트 문자열을 말합니다.

일반적으로 충분한 길이(ex> 16바이트 이상을 말함. MySQL은 20바이트)를 가지며, 각 비밀번호마다 고유하게 생성되어 해시값과 같이 저장됩니다. (솔트 자체가 비밀 정보는 아닙니다.)

솔트는 다음과 같은 목적으로 사용됩니다.

1. 해시값의 고유성 확보

동일한 비밀번호를 사용하는 여러 사용자가 있더라도, 각 사용자마다 다른 솔트를 적용하면 DB에는 서로 다른 해시값이 저장되어 안정성이 확보됩니다.

2. 레인보우 테이블(Rainbow Table) 공격 무력화

미리 계산된 해시값 목록을 사용하는 레인보우 테이블 공격을 매우 어렵게 만듭니다.

3. 사전/무차별 대입 공격 효율 저하

공격자가 추측한 비밀번호를 검증할 때마다 각기 다른 솔트로 해시하며 공격해야 하기 때문에 공격자의 시간과 계산 양을 증가 시킬 수 있습니다.

[caching_sha2_password]

기본적으로 sha256_password 플러그인과 동작 방식은 비슷합니다. 그 외에 중요한 다른 점은 자체 캐시 기능이 있다는 것입니다. 즉, sha256_password의 문제점인 성능 개선을 위해 캐시 기능이 추가되었다고 볼 수 있습니다.

클라이언트가 접근을 시도할 때, 해시값 비교를 위한 계산 작업 대신 먼저 캐시에 클라이언트의 인증 정보가 있는지 확인하고 그 값이 유효한지 확인한 후 접근 여부를 결정합니다. 만약, 캐시에 인증 정보가 없거나, 유효하지 않다면 다시 인증을 위한 계산 작업을 진행합니다.

caching_sha2_password 플러그인도 클라이언트와 연결 시 SSL/TLS 연결 및 RSA 키 쌍을 이용한 연결 방식만 가능합니다.

MySQL에서 버전에 따라 어떤 인증 알고리즘을 사용하는지 정리하면 다음 테이블과 같습니다.

MySQL 버전기본 비밀번호 알고리즘적용 비밀번호 알고리즘
MySQL 1.0 ~ 4.0mysql_old_passwordmysql_old_password
MySQL 4.1 ~ 5.5mysql_native_passwordmysql_native_password mysql_old_password (Deprecated from MySQL 5.6)
MySQL 5.6 ~ 5.7mysql_native_passwordcaching_sha2_password (Introduce from MySQL 5.7.23) sha256_password (Introduce from MySQL 5.6) mysql_native_password mysql_old_password (Removed from MySQL 5.7)
MySQL 8.0 ~caching_sha2_passwordcaching_sha2_password sha256_password(Deprecated from MySQL 8.0.15) mysql_native_password (Deprecated from MySQL8.4 / Removed from MySQL9.0)

3. mysql_native_password 인증 플러그인

MySQL Ver. 5.6~5.7까지 기본으로 사용하였던 인증 플러그인으로, 아마도 대부분의 사용자가 아직도 사용하는 인증 플러그인일 것입니다. mysql_native_password에 대해 좀 더 자세히 알아보도록 하겠습니다.

3.1 MySQL Ver. 8.0에서 사용하기

Mysql_native_password 플러그인은 MySQL Ver. 5.6~5.7에서는 따로 값을 설정하지 않으면 기본적으로 사용이 가능합니다. 하지만, MySQL Ver. 8.0부터는 기본 인증 알고리즘이 caching_sha2_password 플러그인으로 변경되었기 때문에, mysql_native_password 인증 플러그인을 사용하려면 다음과 같이 처리해야 합니다.

MySQL Ver. 8.0에서 제대로 설정하게 되면 다음과 같이 설정된 것을 확인할 수 있습니다.

## 1.기본 인증 플러그인 확인
> show global variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
+-------------------------------+-----------------------+
1 row in set (0.01 sec)

## 2.기본 인증 플러그인 명시 없이 계정 생성 
> create user 'yum_native1'@'%' identified by 'Yumtest!@3';
Query OK, 0 rows affected (0.01 sec)

## 3.기본 인증 플러그인 명시 후 계정 생성 
> create user 'yum_native2'@'%' identified with mysql_native_password by 'Yumtest!@3';
Query OK, 0 rows affected (0.01 sec)

## 4.생성된 계정 생성 및 해시값 확인 
> select user, host, plugin, authentication_string from mysql.user where user like 'yum%' ;
+-------------+------+-----------------------+-------------------------------------------+
| user        | host | plugin                | authentication_string                     |
+-------------+------+-----------------------+-------------------------------------------+
| yum_native1 | %    | mysql_native_password | *AF876ADF7D0FD7DEC6400E0E15D903AC4489762B |
| yum_native2 | %    | mysql_native_password | *AF876ADF7D0FD7DEC6400E0E15D903AC4489762B |
+-------------+------+-----------------------+-------------------------------------------+
2 rows in set (0.00 sec)

3.2 비밀번호 저장 방식 및 인증 프로세스 설명

mysql_native_password 플러그인은 SHA-1 기반으로 구현된 인증 플러그인으로, 2번 SHA-1 해싱을 진행합니다. (ex> SHA1(SHA1(password))) 이 중 SHA-1 해시 결과는 40자리 16진수 문자열로 변환되며, 앞에 * 문자를 추가하여 총 41자로 mysql.user 테이블에 해당 값이 저장됩니다.

저장된 해시값으로 인증하는 동작 방식은 다음과 같습니다.

1. 클라이언트 요청클라이언트가 서버에 접속을 시도한다. (사용자 정보 포함, 비밀번호 원문 미포함된 정보와 함께)
2. 서버의 시도서버는 20바이트 길이의 임의의 문자열(scramble)를 클라이언트에게 보낸다.
3. 클라이언트 응답클라이언트는 서버로부터 받은 임의의 문자열을 사용하여, mysql_native_password 규칙에 따라 암호 계산을 해서 만들어진 토큰을 서버에 보낸다. 1. 클라이언트는 비밀번호를 SHA-1 한다. (hash_stage1 = SHA1(password)) 2. hash_stage1 값을 다시 한번 SHA-1 해시한다. (hash_stage1_double = SHA1(hash_stage1)) 3. 서버가 보낸 scramble과 이 이중 해시값(hash_stage1_double)을 결합하여 다시 SHA-1 해시한다. (hash_stage2 = SHA1(scramble + hash_stage1_double)) 4. hash_stage1과 hash_stage2를 XOR 연산하여 최종 토큰을 생성하고 서버로 전송한다. (token_client = hash_stage1 XOR hash_stage2)
4. 서버의 검증서버는 클라이언트로부터 받은 답변 토큰이 올바른지 확인한다. 1. 서버는 mysql.user 테이블에 저장된 사용자의 최종 해시값(H_db = SHA1(SHA1(password)))를 가져온다. 2. 서버는 자신이 클라이언트에게 보냈던 임의의 문자열(scramble)과 H_db를 사용하여 hash_server2 = SHA1(scramble + H_db)를 계산한다. 3. 클라이언트가 보낸 token_client와 위에서 계산한 hash_server2를 XOR 연산하여, 클라이언트 측의 hash_stage1 값(SHA1(password)을 유추한다. : hash_stage1_유추값 = token_client XOR hash_server2 4. 이 hash_stage1_유추값을 다시 SHA-1 해싱하여 (SHA1(hash_stage1_유추값) 데이터베이스에 저장된 H_db와 일치하는지 최종 비교한다. 5. 비교 결과가 같다면 인증 성공, 다르다면 인증 실패를 처리한다.

4. caching_sha2_password 인증 플러그인

caching _sha2_password 플러그인은 MySQL Ver. 5.7부터 제공된 인증 플러그인으로, MySQL Ver. 8.0부터 기본 인증 플러그인으로 설정되었습니다. MySQL Ver. 9.0 부터는 caching_sha2_password를 기본 인증 플러그인으로 사용해야 하기 때문에 mysql_native_password를 기본으로 사용하는 MySQL은 지금부터 도입 준비를 해야 합니다. 계정 관리 부분에도 영향을 미칠뿐 아니라 클라이언트의 접근 프로토콜도 변경해야 하기 때문입니다.

4.1 MySQL Ver. 8.0에서 사용하기

caching_sha2_password 플러그인은 SHA-256 기반으로 만들어진 인증 플러그인 입니다. 기본적으로 MySQL Ver. 8.0을 설치하면 사용할 수 있기 때문에 추가 설정이 필요하지는 않습니다.

다음과 같이 기본 인증 플러그인 확인 및 사용이 가능합니다.

## 1.기본 인증 플러그인 확인
> show global variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.01 sec)

## 2.기본 인증 플러그인 명시 없이 계정 생성
> create user 'yum_caching1'@'%' identified by 'Yumtest!@3';
Query OK, 0 rows affected (0.02 sec)

## 3.기본 인증 플러그인 명시 후 계정 생성
> create user 'yum_caching2'@'%' identified with caching_sha2_password by 'Yumtest!@3';
Query OK, 0 rows affected (0.00 sec)

## 4.생성된 계정 생성 및 해시값 확인
> select user, host, plugin, authentication_string from mysql.user where user like 'yum_caching%';
+--------------+------+-----------------------+------------------------------------------------------------------------+
| user         | host | plugin                | authentication_string                                                  |
+--------------+------+-----------------------+------------------------------------------------------------------------+
| yum_caching1 | %    | caching_sha2_password | $A$005$.xSB;,FqjM'-t*i4s2.boH9Y0c0OE1Q4BtAq5VFTElT7V3JcfHkwwXY/G2      |
| yum_caching2 | %    | caching_sha2_password | $A$005$+i;5v8l|f)@oEe_  2)43qL.RLyW62cRdZFZGmgZDOuE6gwhvMoTAQ5e1LGGu1  |
+--------------+------+-----------------------+------------------------------------------------------------------------+
2 rows in set (0.00 sec)

4.2 비밀번호 저장 방식

caching_sha2_password 인증 플러그인은 SHA-256 기반으로, 솔트를 사용하고, 키 스트레칭(Key Stretching)을 위해 해싱 작업을 반복해서 수행합니다.

[솔트 생성]

사용자가 비밀번호를 만들거나, 수정할 때, MySQL은 해당 비밀번호만을 위한 고유하고 예측 불가능한 암호학적으로 안전한 임의의 문자열(Salt)를 자동 생성합니다.

[키 스트레칭을 위한 반복 해싱]

먼저 생성된 솔트와 평문 비밀번호를 함께 섞습니다. 이 혼합된 값을 HMAC-SHA256과 같은 강력한 암호화 함수(의사 난수 함수, PRF)에 넣고, 이 과정을 caching_sha2_password_digest_rounds 변수에 설정된 횟수(기본: 5000)만큼 반복해서 적용합니다.

[키 스트레칭(Key Stretching)]

암호학 기법을 말하는 것으로, 비밀번호와 같이 약할 수 있는 키의 보안 강도를 높이는 방법을 말합니다. 일반적으로 안전한 해시 함수나 의사 난수 함수를 사용하여 수십만 또는 수백만 번 반복적으로 해싱작업을 통해 키의 보안 강도를 높힙니다.

암호화된 최종값을 분석해 보면 다음과 같이 간단히 정리해 볼 수 있습니다.

비밀번호 관련 컬럼 authentication_string에 저장되는 값을 조금 더 살펴보려고 합니다. 기본적으로 문자열은 $로 값들을 구분합니다. 앞에서부터 하나씩 어떤 값을 의미하는지 살펴보겠습니다.

  1. A: caching_sha2_password를 의미하는 대문자 A
  2. 005: 5000번의 반복됨을 의미하는 005,
  3. xSB;,~~: 사용된 20바이트의 임의의 문자열 솔트값을 인코딩한 값
  4. 마지막 문자열: 최종 변환된 해시값

4.3 비밀번호 인증 프로세스

클라이언트에서 MySQL 서버로 접근을 시도할 때, 인증 처리하는 방식은 완전한 인증(Full Authentication)과 빠른 인증(Fast Authentication) 방식으로 나눌 수 있습니다.

4.3.1 Full Authentication (완전한 인증)

클라이언트에서 MySQL 서버로 처음 접근을 시도하게 될 때, 어떤 방식으로 인증을 처리하는지 알아보도록 하겠습니다. 먼저 클라이언트가 접근을 시도하게 되면 인증에 필요한 각종 정보를 먼저 전달하고, 연결 방식을 확인하는 단계를 거칩니다.

[ 클라이언트 요청 ]

클라이언트가 접속을 시도할 때는 사용자 이름, 클라이언트가 지원하는 기능 등의 초기 정보를 서버에 전달합니다. 이때 비밀번호 원문은 전송하지 않습니다.

[ MySQL 서버 확인 ]

MySQL 서버는 클라이언트로 부터 받은 정보를 기반으로 해당 사용자의 인증 플러그인이 caching_sha2_password임을 확인하고 클라이언트에게 이를 알립니다.

[ 클라이언트 정보 전달 ]

MySQL 서버로부터 답변을 받고, 클라이언트는 3가지 인증 경로 중 자신이 사용하는 인증 경로를 사용하여 서버에 비밀번호를 전달합니다. caching_sha2_password는 아래의 2가지 연결방식으로만 사용이 가능합니다.

MySQL 서버는 접근하는 클라이언트의 연결 방식에 따라 비밀번호를 전달하는 방식이 달라집니다.

  1. SSL/TLS 연결 방식 SSL/TLS를 통해 접근하는 경우 암호화된 프로토콜을 통해 비밀번호 원문이 서버에 전달됩니다. 서버는 클라이언트로 부터 평문 비밀번호를 받아서 검증 작업을 진행합니다.
  2. RSA 키 쌍을 사용하는 연결 방식 이 방식으로 연결하는 경우 다음과 같은 방식으로 비밀번호를 전달합니다. (1) 서버의 RSA 공개키 전송 (2) 받은 RSA 공개키를 사용하여 평문 비밀번호를 암호화 (3) 암호화된 비밀번호를 서버에 전달 .

[ 인증 정보 확인 및 검증 진행 ]

서버는 이렇게 전달받은 정보를 처리하여 인증 확인 및 검증을 진행합니다.

  1. SSL/TLS 연결 방식 (1) 클라이언트로 부터 받은 비밀번호와 서버에 저장된 해당 계정의 솔트값/반복횟수값을 사용하여 해시 작업을 진행합니다. (2) 계산된 해시값과 mysql.user 테이블의 authentication_string에 저장된 해시값을 비교하여 인증 성공 여부를 결정합니다.
  2. RSA 키 쌍을 사용하는 연결 방식 (1) 서버는 자신의 RSA 개인키로 암호화된 비밀번호를 복호화하여 평문 비밀번호를 얻습니다. (2) 평문 비밀번호를 서버에 저장된 해당 계정의 솔트값/반복횟수값을 사용하여 해시 작업을 진행합니다. (3) 계산된 해시값과 mysql.user 테이블의 authentication_string에 저장된 해시값을 비교하여 인증 성공 여부를 결정합니다.

위 내용을 정리하면 다음과 같은 흐름도로 정리할 수 있습니다.

4.3.2 Fast Authentication(빠른 인증)

caching_sha2_password 인증 플러그인을 사용하면 재인증 시 캐시된 정보로 빠르게 인증이 가능해 집니다. 즉, 클라이언트가 이전에 해당 MySQL 서버에 완전한 인증(Full Authentication)에 성공하여 MySQL 서버의 메모리에 해당 사용자에 대한 빠른 재인증용 정보가 캐시된 경우에 가능합니다.

재인증용 정보가 캐시된 경우 프로세스는 다음과 같습니다.

  1. 클라이언트의 재접속 및 재인증 요청
  2. 임의의 서버의 문자열(Nonce)를 생성하여 클라이언트에 전달
  3. 클라이언트는 MySQL 서버의 논스(Nonce)값과 전달할 비밀번호를 사용하여 암호화해 전달
  4. 클라이언트로 암호화된 정보를 전달받은 MySQL 서버는 해당 정보를 검증하여 인증 성공 여부를 결정

캐시를 사용한 인증 방식에 대한 성공 프로세스는 다음과 같습니다.

캐시를 사용한 인증 방식이 진행되면서 실패가 발생하는 경우는 다음과 같습니다.

캐시된 인증 정보는 MySQL 메인 프로세스가 사용하는 메모리 영역 중 힙(Heap) 영역에서 해당 플러그인이 사용하는 영역에 할당되어 저장됩니다. 이 정보는 authentication_string 값이 생성/변경되는 작업이 수행되면 해제되어 삭제됩니다.

authentication_string 값이 해제되어 삭제되는 작업은 다음과 같습니다.

5. caching_sha2_password 인증 플러그인 도입을 위한 고려 사항

caching_sha2_password 인증 플러그인을 도입하는 경우 다음과 같은 사항들을 고려하여 준비해야 합니다.

5.1 클라이언트/MySQL 서버 간의 연결 방식 결정

caching_sha2_password 인증 방식을 사용하는 경우 아래의 2가지 연결 방식 중 하나를 선택하여 MySQL 서버를 설정해야 합니다.

현재 이 중 하나의 방법으로 MySQL 연결 방식을 사용하고 있다면 고민할 지점이 없겠지만, 만약 그렇지 않다면 어떤 것을 사용하는 것이 좋을지 고민하여 결정해야 합니다. 어떤 연결 방식을 선택하던지 현재 운영 중인 MySQL에 영향이 갈 수 밖에 없기 때문에 기존 방식을 변경하는 것은 어려운 문제입니다. 각자 MySQL 운영 환경에 따라 가장 적절한 것을 선택하는 것이 필요하고, 중요한 것은 연결 방식 변경에 따른 운영 영향도를 정확히 파악하여 조치하는 자세일 것입니다.

만약 기본 연결 방식에 SSL/TLS 연결 방식으로 변경한다면 다음의 사항을 파악해야 합니다.

연결 방식의 변경은 MySQL 구성과 운영의 관점에서 고려해야 하는 사항이 많습니다. 하지만, 이 문서에서 연결 방식의 변경에 따른 영향도는 주제와 안맞는 것이라 보여 여기서는 자세히 정리하지 않으려 한다.

5.2 인증 방식 변경에 따른 영향도 확인

mysql_native_password 인증 방식에서 caching_sha2_password 인증 방식으로 변경하는 경우 아래의 2가지 사항에 대해 정리해야 합니다.

SSL/TLS 연결 방식이나 RSA 공개키를 사용하는 경우라면 이 2가지만 고민하면 대부분 전환하는 데 문제가 없을 것으로 보입니다. 하지만, 기존에 다른 인증 방식으로 사용하던 계정에 대한 처리 방안은 고민이 필요합니다. 메이저(Major) 업그레이드를 하면서 진행하고자 한다면, 어떤 방식으로 전환해야 하는가에 대한 프로세스 고민도 필요합니다.

계정 변경 및 전환 방법은 각 서비스 구성 및 서비스 민감도에 따라 다양한 시나리오가 가능하기 때문에 여기서는 상세히 다루지 않으려 합니다. 각자 운영하는 시스템에 따라 가장 적절한 시나리오는 전부 다를 것이라고 생각하기 때문입니다.

결론

이 문서에서는 MySQL Ver. 5.7에서 도입된 caching_sha2_password 플러그인의 동작 방식에 대해 알아보았습니다. MySQL Ver. 8.4까지는 mysql_native_password 인증 플러그인을 사용할 수 있기 때문에 큰 문제는 없겠지만, MySQL Ver. 9.0부터는 기본으로 사용할 수 밖에 없게 되었습니다. 아직은 먼 미래라 생각할 수 있지만, 해당 인증 플러그인의 도입으로 MySQL 서버/클라이언트 사이의 연결 방식도 변경되어야 하기 때문에 전환 작업에 어려움이 예상됩니다. 그래서, 이 부분을 미리 준비하여 대처하는 것이 필요할 것으로 보입니다.

도입을 준비하는 분들에게 이 글이 많은 도움이 되길 바랍니다.

참고 자료