Django는 기본적으로 PBKDF2 암호화 알고리즘을 제공하고 있다.
그러나 Django 공식 문서(https://docs.djangoproject.com/en/4.1/topics/auth/passwords/)의
Using Argon2 with Django 부분을 살펴보면,
Argon2 is the winner of the 2015 Password Hashing Competition,
a community organized open competition to select a next generation hashing algorithm.
It’s designed not to be easier to compute on custom hardware than it is to compute on an ordinary CPU. The default variant for the Argon2 password hasher is Argon2id.
Argon2 is not the default for Django because it requires a third-party library. The Password Hashing Competition panel, however, recommends immediate use of Argon2 rather than the other algorithms supported by Django.
라고 설명하고 있다.
요약하면 Agron2는 Django가 사용하는 기본 암호화 알고리즘은 아니지만,
암호 해싱 대회에서 우승했을 정도로 우수한 보안을 자랑한다는 뜻.
웬만해서는 암호화 알고리즘을 변경하지 않아도 된다고 Django 공식 문서에서 권고하고 있지만,
현재 만들고 있는 개인 프로젝트에 Argon2 알고리즘을 적용해보고 싶은 욕심이 생겼다.
프로젝트는 메우 단순한 구조인지라 암호화 알고리즘을 변경해야할 정도로 보안이 중요하진 않다.
그래도 언젠가 사용할 일이 있을수도 있지 않을까~ 싶은 마음에 적용해보았다.
생각보다 정말 매우매우 간단하다.
1. 파이참 터미널 창을 열고 Argon2 라이브러리 설치
$ pip install argon2-cffi
2. config/settings.py에 하단의 코드 추가
# config/settings.py
...
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.ScryptPasswordHasher',
]
순서 중요하다. 반드시 Argon2PasswordHasher가 맨 위에 위치해야한다. 맨 위에 있는 알고리즘을 대상으로 가입 시 암호화를 진행하고, 비밀번호를 해독할 때는 맨 위에 있는 것부터 순서대로 if문 돌려가며 알고리즘과의 일치 여부를 확인하는 식으로 돌아가는 것 같다.
+ DB를 직접 확인해보니,
기존에 PBKDF2로 암호화되어있던 test0001 계정에 로그인 한 뒤에 DB를 새로고침하면,
argon2 알고리즘으로 password 형식이 변경되어 있음을 알 수 있다.
암호화 알고리즘을 변경한 뒤에 로그인을 진행하게 되면, 기존에 사용하던 암호화 알고리즘까지 새롭게 적용한 알고리즘으로 변경되는 것을 확인할 수 있었다.
3. 회원가입 및 로그인 테스트
4. 관리자 계정으로 로그인하여 argon2 알고리즘 적용 확인
agron2 알고리즘을 적용한 회원 뿐 아니라 기존에 PBKDF2 암호화를 적용하여 가입한 회원 또한 로그인이 잘 되는 것을 확인할 수 있다.
이게 끝이다. 너무 간단해서 놀랍지 않나?
이하는 사족
처음엔 Django 공식 문서를 찾아보지 않고,
Agron2 공식 문서와 구글 서치 등을 통해 Agron2 알고리즘을 적용해보려고 했는데 정말 쉽지않았다.
Argon2 공식 문서를 참조했을 때는 account 앱의 views.py에서 PasswordHasher를 import하고 PasswordHasher가 제공하는 hash 함수를 통해 유저가 기입한 값을 해싱하는 방식으로 코드를 작성했다. (여기까지만 해도 간단하게 해결될 줄 알았다.)
근데 검색을 해보니 무슨 LoginView와 User를 상속받아 함수를 재작성하고... models.py를 다시 작성해야하고...
(accounts에 migrations 파일도 굳이 안 만들었는데 왜 models.py를 다시 작성해야하는지 알 수 없었다.)
아무튼 Django를 배우기 시작한지 한 달도 되지 않은 나에게는 너무 어려워보였다.
그렇게 며칠을 붙잡고 있다가 Django 공식 문서를 통해 이 문제를 해결했다.
(https://docs.djangoproject.com/en/4.1/topics/auth/passwords/#using-argon2-with-django)
argon2를 설치한 후, settings.py에 argon2 알고리즘 사용하겠다는 설정만 해주면 Django 내부에서 알아서 처리해준다.
진짜 그냥 공식 문서에 쓰인 대로만 하면 5분도 안걸려서 해결이 가능한 문제였다.
결론 : 공식 문서가 하라는대로 해보고 안되면 구글링하는게 최고
'Django' 카테고리의 다른 글
Django 사용자별 페이지 접근 권한 설정하기 (0) | 2022.12.07 |
---|---|
Django 회원가입 후 자동 로그인 (0) | 2022.12.07 |
Django 회원가입 기능 추가하기 (0) | 2022.12.01 |
Django 로그인, 로그아웃 기능 추가하기 (0) | 2022.12.01 |
postgreSQL 데이터 프론트에 띄우기 (0) | 2022.12.01 |
댓글