반응형
MySQL을 처음 접했을 때 가장 혼동하기 쉬운 것 중 하나가 바로 PASSWORD() 함수다. 이 함수는 사용자 비밀번호를 암호화하는 용도로 알려져 있지만, 실제로는 일반적인 애플리케이션에서 사용하는 해시 함수가 아니다.
또한 MySQL 버전에 따라 OLD_PASSWORD()라는 함수도 함께 등장하는데, 이 둘의 차이와 사용 용도는 반드시 구분해야 한다.

PASSWORD() 함수란?
SELECT PASSWORD('admin');
-- 결과 예시: *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
- MySQL 내부 사용자 인증 시스템에서 비밀번호를 해시 저장하기 위한 함수다.
- SHA1과 비슷한 해시 알고리즘을 사용하며, 결과는 *로 시작하는 41자리 문자열이다.
- 애플리케이션에서 사용하도록 설계된 함수가 아니다.
PASSWORD 함수의 특징
- 내부용도: mysql.user 테이블의 authentication_string 등에 저장
- MySQL 5.7 이후부터는 caching_sha2_password, mysql_native_password 등 별도 인증 플러그인 사용
- MySQL 8.0 이상에서는 PASSWORD() 함수는 더 이상 기본 사용되지 않음
- 사용 예시는 아래와 같다.
-- 사용자 생성 시 PASSWORD() 사용 예시
CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test123';
-- 또는
SET PASSWORD FOR 'test'@'localhost' = PASSWORD('test123');
OLD_PASSWORD() 함수란?
SELECT OLD_PASSWORD('admin');
-- 결과 예시: 5d2e19393cc5ef67
- MySQL 4.x 시절의 구버전 해시 알고리즘으로 암호화된 문자열을 생성한다.
- 16자리 문자열 반환
- 오래된 시스템과의 호환성 유지를 위해 존재하나, 보안성이 매우 낮아 실무에서 사용 금지
반응형
PASSWORD() vs OLD_PASSWORD()
| 함수명 | 해시 길이 | 보안성 | 사용 용도 |
| PASSWORD() | 41자 | 낮음 | MySQL 내부 사용자 인증 |
| OLD_PASSWORD() | 16자 | 매우 낮음 | 구버전 호환용 (비추) |
실무에서 쓰면 안 되는 이유
- PASSWORD()는 MySQL의 내부 로직용 함수로, 웹 애플리케이션이나 회원 시스템에 사용하는 것은 보안상 매우 위험하다.
- 보안이 강화된 SHA2(), SHA() 또는 bcrypt, argon2 등을 사용하는 것이 권장된다.
- 비밀번호 비교 시도도 WHERE password = PASSWORD('입력값') 이런 방식은 취약하며 SQL Injection 대응도 불완전하다.
MySQL 권장 암호화 방식
MySQL 8.0에서는 사용자 인증 시 mysql_native_password 대신 caching_sha2_password를 기본값으로 사용한다.
CREATE USER 'secure_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'StrongP@ss!';
- 더 안전한 암호화 방식을 내부적으로 사용하며, 클라이언트 라이브러리도 호환 필요
외부 애플리케이션에서 비밀번호 암호화 처리 예시 (PHP)
$hash = password_hash("userpassword", PASSWORD_BCRYPT);
- MySQL에 저장할 때는 이 해시를 그대로 INSERT
- 비교는 password_verify()로 수행
정리
- PASSWORD()와 OLD_PASSWORD()는 MySQL 내부 인증을 위한 해시 함수로, 일반적인 애플리케이션에서 사용하면 안 된다.
- 실무에서는 SHA2, bcrypt, argon2 등의 강력한 암호화 방식 사용이 권장된다.
- 레거시 시스템 유지보수 시 OLD_PASSWORD()와의 호환 여부만 주의해서 접근하자.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_password
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_old-password
반응형
'DB' 카테고리의 다른 글
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |
|---|---|
| [MySQL] ENCODE와 DECODE 함수 사용법 🔐 (1) | 2025.07.28 |
| [MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐 (0) | 2025.07.25 |
| [MySQL] MD5와 SHA 해시 함수 비교와 실전 활용 (1) | 2025.07.25 |
| [MySQL] 숫자, 날짜, 문자형 자유 변환 꿀팁 모음 (3) | 2025.07.25 |
| [MySQL] 날짜 → 문자열 변환: DATE_FORMAT 응용하기 🗓️ (2) | 2025.07.25 |
| [MySQL] 문자열 → 날짜 변환: STR_TO_DATE 실전 예제 📆 (1) | 2025.07.25 |
| [MySQL] CONVERT 함수와 CAST 차이점 비교 (0) | 2025.07.25 |