ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Django 연습장 - 3. User form 수정해서 회원 가입 조건 변경
    프로그래밍/Django 2022. 4. 14. 21:20
    반응형

    기존에 만들었던 회원가입은

    1. 비밀번호 확인창이 없다.

    2. DB에 비밀번호 암호화가 되지 않는다.

     

    두 가지의 문제가 있었습니다. (물론 html css도 안 꾸민 페이지이지만 기능상으로 본 문제점은..)

     

    따라서 form을 변경하여 다음의 문제들을 해결해 보겠습니다.

    오늘은 forms.py에 있는 UserForm만 수정하면 됩니다.

    1. 비밀번호 확인창 만들기 & 검사하기

    기존 코드에서 password_confirm이라는 form 변수를 하나 더 만들고

    기존 password도 widget을 추가합니다. -> widget추가 안 하면 input창에 비밀번호 입력하는 게 그대로 보입니다.

     

    그 후 clean 함수를 가져와서 추가하고 싶은 로직을 적습니다.

    보시면 아시겠지만 데이터를 가지고 와서 password와 password_confirm을 비교해서 다르면 에러를 발생시킵니다.

    class UserForm(forms.ModelForm):
        password_confirm = forms.CharField(max_length=64, widget=forms.PasswordInput)
        class Meta:
            model = User
            fields = ['email', 'nickname', 'password']
            widgets = {
                'password': forms.PasswordInput()
            }
    
        def clean(self):
            cleaned_data = super().clean()
            password = self.cleaned_data.get('password')
            password_confirm = self.cleaned_data.get('password_confirm')
    
            if password != password_confirm:
                raise forms.ValidationError("패스워드가 일치하지 않습니다.")
    
            return cleaned_data

    2. 저장할 때 암호화하기.

    이전 코드에서 그대로 데이터만 저장하면 Django는 password라는 이름으로 저장되는게 진짜 패스워드인지 알 수 없습니다. 따라서 저장할 때 set_password라는 기능을 사용하여 암호화합니다.

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password'])
        if commit:
            user.save()
        return user

    보시면 저장하려는 user객체를 가져와서 set_password를 통해 비밀번호를 암호화 해서 저장합니다.

     

    이를 통해 데이터베이스에는 암호화 된 상태로 비밀번호가 저장됩니다.

    첫 번째로 저장된 데이터와 다르게 두 번째로 저장된 데이터는 password column의 값이 알 수 없는 형태입니다.

     

    이렇게 암호화를 해서 저장해야하는 이유는 실제로 서비스를 만들 때 일방향 암호화를 해야 하는 대상이기 때문입니다.

    만약 암호화를 하지 않고 저장을 하게 되는 경우 db가 탈취되거나 유출되었을 때 이를 악용할 수 있고, 그에 따른 책임을 질 수 있기 때문입니다. 

     

    반응형
Designed by Tistory.