세션이 동작하기 위해서 '어딘가 에다가' 브라우저마다 저장을 하고 있었다.
브라우저 어디 엔가에 어떤 형태로 세션을 사용하기 위한 정보가 들어가 있다.
바로 "cookie" 라는 곳에 저장이 된다.
복잡한 문자열로 된 key 가 클라이언트를 식별하는 식별자가 된다.
그럼 이 cookie 에 들어 있는 session id 를 가지고 서버에서 클라이언트를 식별하며 그 데이터를 가지고 있는데, 입력한 비밀번호가 모델(DB) 에 저장된 비밀번호와 같다면?
그 때 사용하는 변수가 어떤 변수가 있었지?
# def login(request):
if check_password(password, member.password):
request.session['user'] = member.id
# 고유한 id 값을 session 에 저장 한 것이다.
return redirect('/')
유저가 로그인을 했는지 여부를 판단하기 위해서 "세션으로부터 값을 가지고 와서" 확인을 해본다.
# def home(request):
user_id = request.session.get('user')
if user_id:
member = BoardMember.objects.get(pk=user_id)
return HttpResponse(member.username)
return HttpResponse('Home!')
user_id 값이 있으면 로그인을 한 클라이언트이고 없으면 로그인을 하지 않은 클라이언트이다.
시크릿 창을 열어 root 페이지를 보면 Home! 이라 되어 있고 cookie 에는 아무 것도 확인할 수 없다. 왜냐면 세션 키를 받아오지 못했기 때문이다.
로그인을 했을 때,
그래서 home 으로 리다이렉트 해 사용자 정보를 보여준 것이다.
로그인을 판단하는 기준은?
세션 안에 'user' 키로 값이 들어 있는지 없는지의 유무로 판단했다.
그럼 로그아웃은?
세션 안에 있는 'user' 키를 지운 뒤 root 로 리다이렉트 하는 코드를 쓰면 된다.
def logout(request):
if request.session.get('user'):
del(request.session['user'])
return redirect('/')
그리고 member 앱의 urls.py 로 가서 수정한다.
from django.urls import path
from . import views
urlpatterns = [
path('register/', views.register),
path('login/', views.login),
path('logout/', views.logout),
]
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password, check_password
from .models import BoardMember
def home(request):
user_id = request.session.get('user')
#print(user_id)
if user_id:
member = BoardMember.objects.get(pk=user_id)
return HttpResponse(member.username)
return HttpResponse('Home!')
def login(request):
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
username = request.POST.get('username', None)
password = request.POST.get('password', None)
res_data ={}
if not (username and password):
res_data['error'] = '모든 값을 입력하세요!'
else:
member = BoardMember.objects.get(username=username)
#print(member.id)
if check_password(password, member.password):
#print(request.session.get('user'))
request.session['user'] = member.id
return redirect('/')
else:
res_data['error'] = '비밀번호가 다릅니다!'
return render(request, 'login.html', res_data)
def logout(request):
if request.session.get('user'):
del(request.session['user'])
return redirect('/')
def register(request):
if request.method == "GET":
return render(request, 'register.html')
elif request.method == "POST":
#print (request.POST)
username = request.POST.get('username', None)
#print(username)
password = request.POST.get('password', None)
#print(password)
re_password = request.POST.get('re_password', None)
#print(re_password)
email = request.POST.get('email', None)
res_data = {}
if not (username and password and re_password and email):
res_data['error'] = '모든 값을 입력하세요!'
elif password != re_password:
res_data['error'] = '비밀번호가 다릅니다'
print(res_data)
else:
member = BoardMember(
username = username,
email = email,
password = make_password(password)
)
member.save()
return render(request, 'register.html', res_data)