로그인 기능을 구현하기 위해서는 세션에 대해 알아야 합니다. 세션이란, 웹사이트에 로그인을 하고나면 그 사이트에서는 다시 로그인할 필요 없이 여러 페이지의 기능을 이용할 수 있게 하기 위해 사용됩니다.
일반적으로 웹에서 클라이언트와 서버가 있는데 클라이언트 안에는 쿠키라는게 들어있습니다. 쿠키란 하나의 저장소라고 보시면 되고 클라이언트는 지금 웹사이트를 만들고 있기 때문에 웹 브라우저라고 보면 됩니다. 이 브라우저 안에 쿠키라는 저장공간이 있는데 이 저장공간을 활용해서 데이터를 유지하는 것입니다.
예를 들어 어떤 웹사이트에 접속을 한다고 하면, 서버에 요청을 보내게 되겠죠? 그러면 서버는 헤더에 쿠키 정보를 넣어서 줍니다. 이 쿠키에는 어떤 클라이언트가 로그인 하였는지 구분하기 위한 세션ID라는 것이 들어있습니다. 따라서 클라이언트는 쿠키에 세션ID를 가지고 있게 되고 이후 서버에 요청을 보낼 때 이 쿠키의 세션ID를 서버에 전달하면, 서버는 세션ID를 전달받아 세션ID로 세션에 있는 클라이언트 정보를 가져와 요청을 처리하여 응답을 보내게 됩니다.
세션은 이러한 구조로 동작을 합니다. 조금 복잡하게 느껴질 수도 있지만 장고에서는 이런 작업을 모두 알아서 처리해줍니다. 따라서 실제로 사용하기에는 그렇게 어렵지 않습니다.
먼저 로그인 기능을 구현하기 위해 로그인 페이지에 사용될 템플릿 파일을 만들어보도록 하겠습니다. 이전에 만들어두었던 회원가입 화면에서 이메일과 비밀번호 확인부분만 지워주고 조금만 수정하면 로그인화면으로 이용이 가능하므로 다음과 같이 templates/user에 login.html파일을 만들어보도록 하겠습니다.
from django.shortcuts import render, redirect # 리다이렉트 함수 import from .models import User from django.http import HttpResponse from django.contrib.auth.hashers import make_password, check_password
defhome(request): user_id = request.session.get('user') # 세션으로부터 사용자 ID를 가져옴
if user_id: user = User.objects.get(pk=user_id) # 모델에서 id를 기본키로해서 가져옴 return HttpResponse(user.username) # 모델의 username을 출력 (로그인이 된경우)
return HttpResponse("Home!") # 로그인이 되지 않은 경우 Home!출력
res_data = {} ifnot (username and password): res_data['error'] = '모든 값을 입력해야합니다.' else: user = User.objects.get(username=username) # username필드의 값이 username인 사용자 정보를 가져옴 if check_password(password, user.password): # 비밀번호 확인하는 함수 (입력받은 비밀번호, 데이터베이스에서 가져온 비밀번호) # 비밀번호가 일치, 로그인처리 # 세션, 홈으로 이동(리다이렉트) request.session['user'] = user.id # request.session의 user라는 키에 로그인한 user의 id값을 저장
register함수를 구현했던 것과 비슷하게 login함수를 구현할 수 있습니다. 그냥 url로 접근한 경우와(GET방식) 로그인 버튼을 눌러 접근한 경우로(POST방식)으로 나누어 주고 POST인 경우 사용자 아이디와 비밀번호를 받아 입력받지 않은 경우에 예외처리를 진행하고 정상적으로 입력받은 경우 입력받은 id에 맞는 사용자 정보를 가져와 user라는 객체를 생성합니다. 이후, 비밀번호가 일치하는지를 검사하게 되는데 새로 import한 check_password라는 함수를 사용하여 검사를 수행합니다. 비밀번호가 일치하다면 세션의 ‘user’라는 키값에 사용자의 id를 저장해주고 홈페이지로 redirect하게됩니다. 반면 비밀번호가 일치하지 않는다면 에러메세지를 출력하게 되죠.
home함수는 로그인에 성공하게 되면 사용자의 id를 출력하고, 로그인이 되지 않은 경우에는 Home!를 출력하게 되어있습니다.
이제 community/urls.py에 다음과 같이 root(홈페이지)경로를 추가해주도록 합니다.
1 2 3 4 5 6 7 8 9
from django.contrib import admin from django.urls import path, include from user.views import home