Django 로 게시판 만들기(11). Login 세션과 리다이렉트 처리

.·2020년 7월 25일
1

게시판만들기

목록 보기
11/21

앞서 포스팅한 과정을 테스트 해보니 뭔가 한번 깜박였지만 화면은 그대로이다.
로그인하는 코드를 구현하다가 중도에 password 가 같은지 유무를 확인하고 같았을 때 진행될아래 코드를 pass 로 남겨 두었다.

그럼 이제 이 pass 로 남겨 둔 부분을 세션을 사용해서 실제로 로그인이 된 것처럼 처리를 하기 위해 코드를 작성하자.

그 전에 리다이렉트 처리를 먼저 해주자.

1. Redirect 란?

1-1. HTTP 리다이렉트(Redirect)란?

리다이렉트란 말 그대로 re(다시) + 지시하다(direct) 다시 지시하는 것입니다.
예를 들어 브라우저가 www.test.com/page1 URL을 웹 서버에 요청했습니다. 서버는 HTTP 응답 메시지를 통해 "www.test.com/page2 로 다시 요청하세요~" 라고 브라우저에게 다른 URL(길, 방향) 을 지시할 수 있습니다.

출처: https://dololak.tistory.com/147 [코끼리를 냉장고에 넣는 방법]

1-2. from django.shorcuts import render, redirect

view 의 상단에 redirect 를 import 해 온다.
세션 처리 코드를 완성한 뒤 그 아래에 다음과 같은 코드를 작성하면 홈으로 이동이 될 것이다.

    else:
            member = BoardMember.objects.get(username=username)

            if check_password(password, member.password):
                pass
                # session!
                # redirect!
                return redirect('/')


            else:
                res_data['error'] = '비밀번호가 다릅니다!'

return redirect('/') 의 슬래시는 'root' 경로인 http://127.0.0.1:8000/ 를 의미한다.

2. session 처리

member = BoardMember.objects.get(username=username)

if check_password(password, member.password):
    request.session['user'] = member.id

request.session 은 아래와 같이 프린트 된다. 중요한건 아닌데 궁금해서 찍어보았다.

<django.contrib.sessions.backends.db.SessionStore object at 0x7f8d3382a850>

request.session 은 각 키마다 값을 가지고 있는 dictionary 와 비슷한 형태라고 알고 있자.

request.session 에 'user' 라는 키 에다가 member 의 id (pk값 : 18로 확인된다) 를 넣어준다.

그리고 'user' 라는 키 말고 이름은 내 마음대로 지정해도 된다.
단지 세션 'user' 라는 키에 유저 정보를 저장해 둔 것이다.

이는 로그인한 유저의 id 값을 저장한 것이다.
이렇게 넣은 것 만으로 세션 처리가 끝난 것이다.

3. config/urls.py 경로 수정

member 앱의 urls.py 가 아닌 config/urls.py 에서 최상단 루트로 접근해서 보여줄 경로를 작성한다.

from django.contrib import admin
from django.urls import path, include

from member.views import Home

urlpatterns = [
    path('admin/', admin.site.urls),
    path('member/', include('member.urls')),
    path('', home),
]

아직 view 에 함수 Home() 을 만들지 않아서 error 가 뜰 것이다.

확인 차원에서 간단한 코드를 작성해보자.

def home(request):
    return HttpResponse('Home!')

이제 로그인 유무를 제대로 확인하기 위해서 def Home() 을 바꿔보자

4. def home() 작성

여기서는 최종적으로 루트 화면을 보여줄 것이지만, '로.그.인' 된 루트 화면을 보여주는게 목적이다.

4-1. 세션으로부터 사용자 정보를 가져오기

def home(request):
    user_id = request.session.get('user')

구글 크롬 브라우저에서 앞서 회원가입 및 로그인을 진행했다면, request.session 의 'user' 키에 사용자 id 값이 있을 것이다.

그런데 세션이 만료되는 조건은 무엇일까? 아래 코드를 작성해 보면서 세션에서 받아오는 'user_id' 는 무조건 있게 되는거 아닌가 싶어서 였다.

어쨋든 user_id 가 있다면 사용자 정보를 가져와 보자.

if user_id:
    member = BoardMember.objects.get(pk=user_id)
    # 아까 세션에 id 를 넣어놓았었다. 세션의 user 키에 넣어 두었던게 id 값이였다.
    return HttpResponse(member.username)
# 아! 로그인을 안했을 때!, user_id 가 없을 때? (세션이 만료되었을 때?)
return HttpResponse('Home!')
# 로그인을 안했을 때 '/' 로 리다이렉트 되면서 'Home!' 문구가 뜰 것이다.

4-2. 중간 코드

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!')
    
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)

5. more session..

로그인을 했을 때 안에서 일어나는 session 에 대해 더 알아보자.
변수에 값을 넣어서 있으면 로그인이 된 거라 인지하면 되는데 cookie 와 session 은 어떻게 데이터를 유지하고 있을까?

개발자도구 - Application tab 에 들어가면 현재 사이트에서 사용하고 있는 정보들을 볼 수 있다. 현재 사이트에서 어떤 쿠키를 사용하는지 볼 수 있다.

쿠키 정보를 보자면 회원가입 전에는 csrftoken 만이 있는데 회원가입 절차가 끝난 뒤에는 sessionid 도 같이 나온다.

sessionid 는 복잡한 문자열로 이루어져 있고 서버에 처음 접속했을 때 세션 아이디를 받아서 쿠키에 저장하고 있다. 그러면 그 다음 부터 모든 요청에 아이디가 같이 넘어가게 되고 그 value (복잡한 문자열) 자체가 브라우저마다 하나의 식별자가 된다.

크롬 시크릿 모드를 열어 쿠키정보를 확인하면 아무것도 없지만 로그인을 하면 쿠키가 생긴다.

하지만 시크릿 모드의 세션 아이디와 일반 창에서 열은 세션 아이디는 서로 다르다.
같은거 같지만 서버 입장에서는 엄연히 다르다.

각 session id 별로 세션 공간이 있다고 보면 된다.

profile
.

0개의 댓글