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

Cha Hwa Young·2023년 3월 22일
1


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개의 댓글