2024. 6. 5. 15:33ㆍ카테고리 없음
Django를 활용한 웹개발 프로젝트 회고
프로젝트 소개
4월 23일 부터 보건의료빅데이터 창업 공모전을 위해 프로젝트를 시작했습니다. 목표는 약사들의 다제약물 관리에서 겪는 부담을 줄여주고, 보다 많은 환자들이 안전하게 약물을 관리받을 수 있도록 돕는 서비스를 웹으로 솔루션을 제공하는 것이었습니다.
사용한 기술 스택
- 프론트엔드 : HTML, Tailwindcss, JavaScript
- 백엔드 : Django
- 데이터베이스 : MYSQL
- 배포 : GCP
- 기타 도구 : Git, Github
개발 과정
개발 초기 단계에서는 솔직히 Django에 익숙치 않은 상태이기 때문에 Django의 모델과 뷰 그리고 urls 연결에 많은 시간을 사용했습니다. 기존에 해봤던 pyburger 프로젝트도 책을 따라 다시 작성해보기도 하고, pystargram이라는 프로젝트도 책을 따라 작성하기도 하고.. 이렇게 Django의 구조에 대해서 이해하는 시간을 많이 가졌습니다.
그 후 로그인 및 로그아웃 등 사용자 인증과 세션 관리에 대해 웹 서비스 개발 시작을 진행했습니다.
도전과제와 해결책
- 도전과제 : 사용자 보안 문제, 사용자 인증 실패 처리
- 해결책 : Django의 authenticate, login 함수, 에러 메세지 추가로 피드백 제공
도전과제 1 : 사용자 보안 문제
문제 : 웹 애플리케이션에서는 비밀번호와 같은 민감한 정보가 외부에 노출되지 않도록 보호해야하는데, 이런 내용을 DB에 그대로 올릴 경우, DB가 노출된다면 타인의 계정으로 쉽게 접속할 수 있는 문제가 발생한다.
해결책 : Django의 'authenticate' 및 'login' 함수를 사용하여 비밀번호를 안전하게 처리합니다. 이러한 함수들의 사용은 사용자의 비밀번호를 해시하고, 올바른 사용자인지 검증하는 과정을 안전하게 처리합니다. 또한 HTML에서 CSRF 토큰을 사용하여 보안을 강화합니다.
user = authenticate(username=username, password=password)
if user:
login(request, user)
도전과제 2 : 사용자 인증 실패 처리
문제 : 사용자가 잘못된 정보로 로그인 할 경우, 적절한 피드백을 제공하지 않는다면 사용자 경험이 저하될 수 있습니다.
해결책 : views.py의 login_view에서 authenticate 함수가 실패했을 때, 폼에 에러 메시지를 추가하여 사용자에게 명확한 피드백을 제공합니다.
else:
form.add_error(None, '사용자 또는 비밀번호가 틀렸습니다.')
전체적인 users/views.py
def login_view(request):
#이미 로그인 되어 있다면
if request.user.is_authenticated:
return redirect('/main/main/')
if request.method == 'POST':
#LoginForm 인스턴스 생성, 입력 데이터는 request.POST 사용
form = LoginForm(data=request.POST)
#LoginForm에 전달된 데이터가 유효하면
if form.is_valid():
#username과 password값을 가져와 변수에 할당
username = form.cleaned_data['username']
password = form.cleaned_data['password']
#username, password에 해당하는 사용자가 있는지 검사
user = authenticate(username=username, password=password)
#해당 사용자가 존재한다면
if user:
#로그인 처리 후 ask 페이지로
login(request, user)
return redirect('/main/main/')
#사용자가 존재하지 않을 경우 실패 로그 출력
else:
form.add_error(None, '사용자 또는 비밀번호가 틀렸습니다.')
#유효성 검사 이후에는 cleaned_data에서 데이터를 가져와서 사용
context = {'form':form}
return render(request, 'users/login.html',context)
else:
#로그인 폼 인스턴스 생성
form = LoginForm()
context = {
'form' : form,
}
return render(request,'users/login.html',context)
결론 및 배운점
이번 공모전을 통해서 Django를 이용한 웹 개발을 처음으로 해보게 되었는데, 개발 시간은 많이 부족했지만 열심히 하면서 많은 것을 배운 공모전이었으며, 이번 포스팅에서는 Django의 강력한 인증 시스템을 사용하는 방법을 배웠습니다. 또한 사용자 인증과 데이터 보안의 중요성에 대해 더 깊이 이해할 수 있었습니다. 또한 최근 SQL injection에 관한 영상을 본 적이 있었는데 그것을 구현한 페이지에 테스트해보아도 문제가 없게 구현하여 매우 만족스러운 결과가 나온거 같습니다.