본문 바로가기

내일배움캠프

DRF로 회원가입 기능 구현하기

장고 심화과제를 진행중 예상치 못했던 문제를 발견했다.

가장 기본적인 CRUD 그리고 회원가입, 로그인, 마이페이지 등을 작성하고 있었는데 회원가입 기능에서 문제가 발생한 것이다.

 

어떻게보면 단순한 문제였지만 동시에 심각한 문제기도 했다. 비밀번호가 데이터베이스에 저장될 때, 암호화가 되지 않는 문제가 있었는데 이때문에 해당 계정으로 로그인이 불가능한 문제가 있었다.  (아마도 입력한 비밀번호는 암호화되어서 전달되는데 데이터베이스에는 암호화되지 않은 비밀번호가 저장되어 있기 때문에 발생한 문제라고 생각되었다.)

 

예상하지 못한 문제였기 때문에 어떻게 해결해야할지 난감했다. 이전에는 사용자로부터 데이터를 입력받을때, Django에서 기본적으로 제공하는 form을 사용했기 때문에 비밀번호의 암호화가 자동적으로 이루어졌지만 이번에는 그렇지 않았기 때문이다. 

 

따라서 drf에서 form과 비슷하게 작동을 하는 serializer가 문제일 것이라고 생각하고  그것을 수정해보기로 했다.

 

class SignupSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = '__all__'

 

 

단순하게 User모델을 직렬화만 해주고 있었다. 아마도 이 부분에서 비밀번호를 해싱해야할것같은데...

 

여기부터는 인터넷을 찾아보고 작성했다.

 

class SignupSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
        extra_kwargs = {'password': {'write_only': True}}
        
    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

 

serialrizer를 위와 같이 수정했다. password를 읽기 전용 필드로 지정하고 부모 클래스에서 상속받은 create를 수정하여 암호화하는 로직을 적용한다.

 

위의 방법대로 create를 수정하니 암호가 정상적으로 해싱되었다. 소스코드를 봐도 아직은 잘 모르겠고... 전에 비슷한 모양을 본것같긴한데 아직은 create가 어떤 식으로 작동하는지 까지는 잘 모르겠다....

아무튼 해결? 확실하게 이해하려면 아직 더 공부를 해야할것같다.