TIL/Python

DRF Serializer 패스워드 해싱

hyo-min 2024. 4. 26. 21:15

DRF를 사용해 serializer로 회원가입 기능을 구현하는데 회원가입은 되는데

비밀번호가 그대로 DB에 저장되는 일이 발생했다.

 

password : !@#$qwer 이 그대로 보인다.

 

 

그래서 serializer의 내부 메소드를 뜯어보고 

장고의 AbstracUser도 뜯어보면서

이리저리 고민하다가

장고의 내부 메소드인 create_user를 실행하면 

make_password()를 해주면서 패스워드를 해싱해준다는 걸 알았다.

make_password(passowrd)의 반환 값이 user.password로 들어간다.

 

내가 make_password의 동작까지는 몰라도

그냥 이 crate_user를 하면 패스워드가 해싱되는거 아닌가? 싶어서 한번 해보았다.

from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

수십번의 오류를 맞이하고 완성된 코드다.

 

다행히 생각대로 user가 생성되면서 password도 해싱이 잘 되는걸 확인할 수 있었다.

 

 

그런데 또 비슷한 문제가 생겼다.

user 비밀번호를 수정하니 해싱이 안되고 그대로 DB에 저장되는 것

 

아무래도 make_password() 메서드를 까보긴 해야할 것 같다...

 

오늘은 시간이 늦어서 다음에 make_password()를 까보고 serializer에 적용해봐야겠다.