작성자 | 성창민 |
일 시 | 2024. 11. 12 (화) 18:00 ~ 21:00 |
장 소 | 복지관 B-128-1호 |
참가자 명단 | 임혜진, 장원준, 이재영, 성창민, 김명원 |
사 진 | ![]() |
오늘은 Django 스터디에서 배웠던 것을 소화시킬 겸, 기존에 개발하던 cliving 프로젝트의 모델을 수정하고 새로운 기능을 개발했다.
1. users/models.py/
기존 cliving은 User기능이 없었다. 따라서 이전 스터디에서 배웠던 것 처럼 app을 하나 더 만들어 User 모델을 구현했다.
기본적인 유저 정보와 어드민 계정 등 권한을 체크하기 위한 필드를 정의했다.
AbstractBaseUser를 상속받아서 손쉽게 User 모델을 만들 수 있었다.
그리고 휴대폰 인증을 위한 PhoneVerification 모델을 추가하여 뒤에서 설명할 전화번호 인증 기능을 구현했다.
해당 모델에서는 휴대폰 번호와 코드를 유효기간동안 저장하고, 코드 인증을 거치면, is_verified 필드에서 인증 여부를 기록했다가 회원가입 시 확인한다. 뒤에서 뷰와 모델을 보며 더 상세하게 설명하겠다.
2. users/views.py & users/serializers.py
user관련 기능들이 구현되어있는 view와 serializer이다. 회원가입 -> 로그인 과정을 살펴보겠다.
먼저 회원가입 전, 휴대폰 번호에 대한 인증을 받아야 하므로,
'인증번호를 생성하고 휴대폰 번호로 전송'하는 View 이다.
문자메세지 전송을 위해 coolsms라는 외부 api를 이용했는데, 건당 20원으로 상당한 가격이다...
어쩔 수 없이 테스트 과정에서는 해당 api를 사용했지만, 추후 좀 더 저렴한 서비스를 찾아야 할 것 같다.
아무튼, 랜덤으로 6자리 인증번호를 생성하고, 전송한다. 생성한 번호는 받은 전화번호와 함께 PhoneVerification 모델에 저장된다.
전송한 인증번호를 이 view에서 검증한다. PhoneVerification에서 전화번호에 해당하는 쿼리를 GET하고, 가져온 쿼리에 대하여 검사를 실시한다. (아예 쿼리 자체가 존재하지 않는다면, 예외처리를 진행하여 해당 번호에 대한 인증 시도가 없었음을 알려준다.)
1. 유효기간이 만료되었는지 검사한다.
2. 인증번호가 일치하는지 검사한다.
두가지 검사를 통과하면 해당 쿼리의 is_verified 필드를 True로 바꾸어 인증된 쿼리임을 표기하고 저장한다.
회원가입 뷰 자체는 매우 심플하다. 검사 과정을 시리얼라이저에서 진행하기 때문. 원래 유효성검사같은 기능들은 시리얼라이저에서 진행하는거라고 배웠던 것 같다. 근데 앞에 인증번호 검사같은것들은 view에서 진행해버렸는데,,, 나중에 수정해야겠다.
아무튼, 회원가입시 5가지 정보를 받는다.
정보에 대한 검증? 을 실시한다.
비밀번호 2개 받은 것이 일치 하는지,
입력받은 전화번호가 인증을 통과한 번호인지.
이 두가지 검증이 통과되면, User 정보를 모델에 저장하기 위한 Create 과정이 진행된다.
validated_data로 바로 저장하면 되는데, 비밀번호는 모델에 저장하지 않으므로, validated_data에 저장되어있는 password1, password2를 pop 해서 날려준다. password하나는 password변수에 저장하여, set_password라는 장고에서 제공해주는 함수를 활용하여 비밀번호를 설정한다.
+)추가로 중복 검사들은 비슷한 코드로서 제공해주었다.
이렇게 회원가입 과정이 끝났다.
.
.
.
다음으로는 로그인인데, 별거 없다.
jwt토큰 방식을 사용하여 비동기 방식으로 로그인을 구현했다.
로그인 시, 엑세스 토큰과 리프레시 토큰을 발행해주고, 프론트에서 이 토큰들을 사용하여 유저의 정보에 대한 접근을 간단하게 진행할 수 있다.
로그아웃은 더 간단하다.
엑세스 토큰을 재발행 해주는 리프레시 토큰을 블랙리스트에 저장하여 더 이상 액세스토큰을 발행하지 못하게 한다. 그러나 가지고있는 액세스 토큰으로 접근하면 안되나? 할 수 있는데, 로그아웃 시 프론트에서 액세스토큰을 파기하므로 리프레스토큰이 만료된 현 시점에서 새로 로그인 하지 않는 한 액세스 토큰을 재발행 할 방법이 없는 것이다.
이전 프로젝트에서는 user 기능을 구현할 때, 얼기설기 많이 힘들어하며 구현했는데, 지금까지 장고 스터디를 하고 프로젝트에 익숙해지며 조금 더 쉽게 user app을 구현할 수 있었습니다.