DB

[MySQL] PASSWORD와 OLD_PASSWORD 함수 완전 해부

인생아 2025. 7. 25. 16:48
반응형

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

 

반응형