[장고] 웹사이트에서 로그인 유지 기능 구현하기

소요 시간: 2분

현대 웹 애플리케이션에서 사용자 경험은 매우 중요합니다. 사용자들이 웹사이트에 접속할 때마다 매번 로그인을 해야 한다면 이는 번거로울 뿐만 아니라 사용자 경험을 크게 저해할 수 있습니다. 특히 쇼핑몰이나 포럼 같은 사이트에서는 사용자가 브라우저를 닫았다가 다시 열어도 로그인 상태가 유지되기를 기대합니다. 이를 통해 사용자는 더 빠르고 편리하게 서비스를 이용할 수 있습니다.

그러나 기본적으로 장고(Django)는 이러한 기능을 제공하지 않습니다. 장고에서 '로그인 상태 유지하기' 기능을 구현하려면, 세션(Session) 관리와 관련된 추가 작업이 필요합니다. 이 글에서는 장고에서 로그인 상태 유지 기능을 어떻게 구현할 수 있는지, 단계별로 자세히 설명하겠습니다. 이 기능을 구현함으로써 사용자 경험을 향상시키고, 더 나은 서비스를 제공할 수 있을 것입니다.


왜 로그인 상태 유지 기능이 필요한가?

웹 애플리케이션에서 사용자 경험은 매우 중요합니다. 사용자가 로그인을 한 후에도 로그인 상태를 유지함으로써 재로그인 과정을 줄이고 편의성을 높일 수 있습니다. 특히 쇼핑몰이나 포럼 같은 사이트에서는 사용자가 브라우저를 닫았다가 다시 열어도 로그인 상태가 유지되기를 기대합니다. 그러나 장고(Django)는 기본적으로 이러한 기능을 제공하지 않기 때문에, 개발자가 직접 구현해야 합니다.


로그인 상태 유지하기란?

로그인 상태 유지하기 기능은 사용자가 브라우저를 종료해도 로그인 상태가 유지되는 것을 의미합니다. 이는 세션(Session)을 통해 구현할 수 있습니다. 세션은 서버에 사용자의 상태 정보를 저장하여, 사용자가 로그인을 했는지 등의 상태를 확인할 수 있게 해줍니다. 이 글에서는 장고에서 '로그인 상태 유지하기' 기능을 어떻게 구현할 수 있는지 단계별로 설명하겠습니다.


로그인 폼에 '로그인 상태 유지하기' 버튼 추가

첫 번째 단계는 로그인 폼에 '로그인 상태 유지하기' 체크박스를 추가하는 것입니다. 이를 위해, 장고의 AuthenticationForm을 확장하여 새로운 필드를 추가합니다.

from django import forms
from django.contrib.auth.forms import AuthenticationForm

class LoginForm(AuthenticationForm):
    remember_me = forms.BooleanField(required=False, label='로그인 상태 유지하기')

여기서 remember_me 필드는 사용자가 체크박스를 선택했는지 여부를 저장합니다. required=False로 설정하여 필수 입력 필드가 아님을 명시합니다.


로그인 뷰 커스터마이징

이제 로그인 뷰를 수정하여 사용자가 '로그인 상태 유지하기'를 선택했는지에 따라 세션 만료 시간을 설정합니다. 이를 위해 LoginView를 상속하여 form_valid 메서드를 오버라이드합니다.

from django.contrib.auth.views import LoginView
from django.contrib.auth import login as auth_login
from .forms import LoginForm

class UpdatedLoginView(LoginView):
    form_class = LoginForm
    
    def form_valid(self, form):
        remember_me = form.cleaned_data['remember_me']
        if not remember_me:
            self.request.session.set_expiry(0)
            self.request.session.modified = True
        return super(UpdatedLoginView, self).form_valid(form)

여기서 form_valid 메서드는 폼이 유효할 때 호출됩니다. remember_me 필드의 값을 확인하여, 체크되지 않았다면 세션 만료 시간을 0으로 설정합니다. self.request.session.set_expiry(0)은 세션이 브라우저 종료 시 만료되도록 설정합니다. self.request.session.modified = True는 세션 데이터가 변경되었음을 명시적으로 알립니다.


세션이란 무엇인가?

세션(Session)은 서버에 사용자의 상태 정보를 저장하는 장소입니다. 반면, 쿠키(Cookie)는 클라이언트에 저장됩니다. 로그인 정보와 같이 민감한 데이터는 세션에 저장하여 보안성을 높이고, 사용자 활동 이력과 같은 비교적 덜 민감한 정보는 쿠키에 저장합니다. 세션은 서버에 저장되기 때문에, 상대적으로 안전하지만, 세션이 만료되면 해당 데이터도 사라집니다.


요약

  1. 로그인 폼에 '로그인 상태 유지하기' 체크박스를 추가합니다.
  2. 로그인 뷰를 커스터마이징하여 사용자가 체크박스를 선택했는지에 따라 세션 만료 시간을 설정합니다.
  3. 세션은 서버에 사용자의 상태 정보를 저장하는 장소로, 민감한 데이터를 안전하게 관리할 수 있습니다.

위 단계를 통해 장고에서 로그인 상태 유지하기 기능을 구현할 수 있습니다. 이를 통해 사용자 경험을 개선하고, 보안성을 유지할 수 있습니다. 이제 사용자들은 로그인 상태를 유지하며 더욱 편리하게 웹 애플리케이션을 이용할 수 있을 것입니다.

장고 리스트