[Django] is.authenticated와 @login_required의 차이

Cha Hwa Young·2023년 3월 22일


DRF로 프로젝트를 하기에 앞서, 개발에 온전히 집중하지 못해 소실된 기억을 되찾고자 Django로 프로젝트를 하고 있다.
단순히 이전 프로젝트에서 사용했던 코드를 따라 적는 것보다 정확히 무슨 의미인지, 왜 필요한지 계속 질문을 하면서 진행하고 있다.

👀 오늘의 첫 번째 궁금증은

회원 탈퇴를 할 수 있게 인증을 하는 과정에서 사용하는 @login_requiredis_authenticated가 어떻게 다른지 궁금했다.
둘 다 '로그인한 유저'만을 위한 것이 아닌가? 라는 생각이 끊이질 않았다.

약, 10년 전 포스팅이지만 🔗스택 오버 플로우에서는 is_aunthenticated는 좀 더 유연하고, @login_required는 선언적(어떻게 보다는 무엇에 가까운)이라는 답이 있었다. 선언적이라는 의미는 여기에서 잘 설명하셨다.
더 깊게 이해해보자!

is_authenticated

is_authenticated는 공식 문서에 의하면 사용자가 인증되었는지 확인하는 방법이라고 한다. 로그인 되어 있다면, True이다.
이는 template에서 바로 확인할 수 있다.

{% if user.is_authenticated %}
    <p>이 유저는 로그인 되어 있습니다.</p>
{% else %}
    <p>이 유저는 로그아웃 되어 있습니다.</p>
{% endif %}

페이지를 접속했을 때 로그인 여부에 따라 다르게 화면에 다르게 출력된다.

@login_required

django에서 제공하는 django.contrib.auth.decorators 모듈 안에 있는 데코레이터이다. (데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용하는 것이라고 이해하자.)
이는 유저가 로그인하지 않았다면, login.url로 리다이렉트하고, 로그인했다면 views.py에서 정의한 함수 혹은 메서드에 접근 가능하게 한다.

한 줄 요약

➡️ 즉, @login_required는 로그인 하지 않으면 접근이 불가능하게 만드는 기능이고, is_authenticated로그인의 여부만 검증 하는 것이다.

따라서, 회원정보 수정의 경우, 로그인을 한 사람만 가능하므로 다음과 같이 @login_required를 사용하고

@login_required
def update(request):
    if request.method == 'POST':
        form = CustomUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('accounts:detail', request.user.pk)
    else:
    	form = CustomUserChangeForm(instance=request.user)
    context = {
        'form': form
    }
    return render(request, 'accounts/update.html', context)

회원가입 후에 자동으로 로그인이 되도록 다음과 같이 is_authenticated를 사용한다.

def signup(request):
    # 이미 로그인된 사람은 companies:index 로 보내기
    if request.user.is_authenticated:
        return redirect('companies:index')
    else:
        if request.method == 'POST':
            form = CustomUserCreationForm(request.POST)
            if form.is_valid():
                # 바로 로그인 되도록 새로 추가된 코드
                user = form.save()
                auth_login(request, user)
                return redirect('companies:index')
        else:     
            form = CustomUserCreationForm()
        context = {
            'form': form
        }
        return render(request, 'accounts/signup.html', context)

참고

profile
기회를 잡는 사람이 되도록!

0개의 댓글