MySQL에서 사용자 이름과 비밀번호를 안전하게 저장하기
MySQL 데이터베이스에 사용자 이름과 비밀번호를 안전하게 저장하려면 MD5() 함수를 사용해 비밀번호를 해시 값으로 변환한 뒤 저장할 수 있습니다. 이렇게 하면 원본 비밀번호가 아닌 해시 값이 데이터베이스에 저장되므로, 데이터베이스가 노출되더라도 실제 비밀번호를 곧바로 알아낼 수 없습니다.
예제를 통해 단계별로 살펴보겠습니다. 먼저 테이블을 생성합니다. 테이블 생성에는 CREATE 명령어를 사용합니다.
mysql> create table UserNameAndPasswordDemo
-> (
-> U_Id int(10) unsigned NOT NULL AUTO_INCREMENT,
-> UserId varchar(255) DEFAULT NULL,
-> UserPassword varchar(255) DEFAULT NULL,
-> primary key(U_Id),
-> UNIQUE KEY `UserId` (`UserId`)
-> );
Query OK, 0 rows affected (0.61 sec)
생성된 테이블의 구조는 다음과 같습니다.
- U_Id: 자동 증가(AUTO_INCREMENT)되는 기본 키
- UserId: 사용자 ID (UNIQUE KEY로 지정되어 중복 저장 방지)
- UserPassword: MD5로 해시된 비밀번호
MD5()로 비밀번호 해시하여 레코드 삽입하기
이제 MD5() 함수를 활용해 레코드를 삽입하고 비밀번호를 안전하게 저장해 보겠습니다.
mysql> INSERT INTO UserNameAndPasswordDemo(UserId, UserPassword) VALUES ('John@gg.com', MD5('john123'));
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO UserNameAndPasswordDemo(UserId, UserPassword) VALUES (MD5('Carol@gg.com'), MD5('123Carol'));
Query OK, 1 row affected (0.14 sec)첫 번째 INSERT 문은 사용자 ID는 그대로 저장하고 비밀번호만 MD5로 해시하여 저장하는 예입니다. 두 번째 INSERT 문은 사용자 ID와 비밀번호 모두 MD5로 해시해서 저장하는 방식입니다.
저장된 레코드 조회하기
이제 SELECT 문을 실행하여 저장된 레코드를 확인해 보겠습니다. 여기서는 UserId가 'John@gg.com'인 레코드만 조회합니다.
mysql> SELECT * FROM UserNameAndPasswordDemo WHERE UserId='John@gg.com';
실행 결과는 다음과 같습니다.
+------+-------------+----------------------------------+
| U_Id | UserId | UserPassword |
+------+-------------+----------------------------------+
| 1 | John@gg.com | 6e0b7076126a29d5dfcbd54835387b7b |
+------+-------------+----------------------------------+
1 row in set (0.00 sec)
UserPassword 컬럼에 'john123'의 MD5 해시 값인 '6e0b7076126a29d5dfcbd54835387b7b'가 저장된 것을 확인할 수 있습니다.
모든 레코드를 조회하려면 다음과 같이 작성합니다.
mysql> SELECT * FROM UserNameAndPasswordDemo;
사용자 이름과 비밀번호가 MD5로 저장된 전체 결과는 다음과 같습니다.
+------+----------------------------------+----------------------------------+
| U_Id | UserId | UserPassword |
+------+----------------------------------+----------------------------------+
| 1 | John@gg.com | 6e0b7076126a29d5dfcbd54835387b7b |
| 2 | 5f565a3d794f85e5db4f3bb7b5811a25 | f1d2fb85f7d6ce7428b9b3fd569be42b |
+------+----------------------------------+----------------------------------+
2 rows in set (0.00 sec)
주의: 실제 서비스에서는 MD5 대신 더 강력한 해시를 사용하세요
MD5는 동작 원리를 이해하기 좋은 학습용 예제이지만, 충돌 공격과 무지개 테이블(rainbow table) 공격에 취약하기 때문에 실제 운영 환경의 비밀번호 저장 용도로는 권장되지 않습니다. 실무에서는 bcrypt, scrypt, Argon2 같은 적응형 해시 알고리즘을 사용하고, 솔트(salt)를 함께 적용하는 것이 안전합니다. PHP의 password_hash(), Python의 passlib, Node.js의 bcrypt 라이브러리 등 검증된 도구를 활용하는 것을 추천합니다.