최근 Django를 이용해 제작하는 프로젝트를 하는 중이다.
Django가 제공하는 CBV 중 PasswordChangeView를 사용해 비밀번호 변경 페이지를 만들던 중에
나를 곤경에 빠지게 했던 경우가 있어 글로 써보자 한다.
Django에서 제공하는 auth는 password라는 자체적인 type을 제공해 입력한 비밀번호를 암호화해주며
안전하게 설정할 수 있도록 도와준다. 이 기능을 자세히 모르고 있어 사단이 났다.
위의 화면처럼 ChangePasswordview를 사용하면 간편하게 비밀번호 변경 페이지를 제작할 수 있다.
여기서 필요한 구성요소는 기존 비밀번호인 old_password, 새 비밀번호인 new_password1
새 비밀번호 확인용인 new_password2가 전부이다. 그래서 비밀번호 변경 페이지는 위의
3개 input들을 submit해 비밀번호가 정상적으로 변경되었다면 PasswordChangeDone 페이지를
띄우는 비교적 간단한 구조였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<form id="password_change_form" action="." method="POST">
{% csrf_token %}
<div class="row">
<div class="col-12"><h2>회원정보 조회/ 비밀번호 변경</h2></div>
</div>
<div class="row">
<div class="ml-1 col-11">
ID:<span class="margin-left-10">{{ user.username }}</span>
</div>
</div>
<div class="row">
<div class="ml-1 col-11">{{ form.old_password.label_tag }}
<span class="margin-left-10">{{ form.old_password }}</span>
</div>
</div>
<div class="row">
<div class="ml-1 col-11">{{ form.new_password1.label_tag }}
<span class="margin-left-10">{{ form.new_password1 }}</span>
</div>
</div>
<div class="row">
<div class="ml-1 col-11">{{ form.new_password2.label_tag }}
<span class="margin-left-10">{{ form.new_password2 }}</span>
</div>
</div>
.......
|
cs |
if form.error 장고 템플릿을 사용해 에러 변수가 존재한다면 경고창을 띄우게 되어 있었는데, 아무리 테스팅을 해봐도
계속 경고창만 띄우는 것이다.
온갖 키워드를 사용해 구글링을 해보고, 공식 문서도 수 십 번 읽어보았지만 알 길이 없었다.
같은 경고창만 띄우며 끙끙 앓던 중 에러의 내용이라도 알고싶어
고육지책으로 에러 문구를 띄우도록 수정을 해보았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endif %}
|
cs |
위의 코드처럼 form의 error들을 출력하도록 수정했더니 놀라운 일이 일어났다.
비밀번호가 너무 간단하다, 비밀번호는 숫자와 영문을 섞어야 한다. 는 에러가 출력된 것이다.
문제는 내가 기존 Test 유저의 비밀번호를 123456789로 설정했고 새 비밀번호를 987654321같은 간단한
비밀번호로 테스트를 진행했던 데서 나타났다.
django가 제공하는 auth의 password는 보안을 강화하기 위해
비밀번호가 너무 간단하거나 아이디와 비슷하지 못하도록 강제하는 기능이 있었던 것이다.
이를 모르고 있어 계속 간단한 비밀번호로 변경을 시도하니 에러 창을 띄울 수 밖에 없었던 것이다.
django의 password validation은 django의 공식 문서에서도 확인할 수 있다.
validation을 수정하고 싶으면 django의 settings에서 아래와 같은 코드를 추가해 준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
|
cs |
'Dev' 카테고리의 다른 글
Apache beam으로 Streaming & Batch 데이터 파이프라인을 생성해보자 (with GCP Dataflow) (1) | 2022.03.15 |
---|---|
Gradle을 이용해서 Springboot + GCP API 연동한 Java 프로젝트 생성 및 배포하기 (2) | 2022.02.12 |
Onclick vs AddEventListener 어떤 것을 사용해야 할까? (2) | 2020.03.27 |
Node.js + MongoDB 로 이미지 웹 만들어보기 (2) (0) | 2020.03.12 |
Node.js + MongoDB 로 이미지 웹 만들어보기 (1) (0) | 2020.03.11 |