WinGyu_coder

Django, React 장고로 로그인 구현하기, 토큰 방식 본문

Django 백엔드의 모든것

Django, React 장고로 로그인 구현하기, 토큰 방식

WinGyu 2024. 4. 1. 09:30

Django REST framework (DRF)로 로그인 기능을 구현할 때, 로그인 기능을 위한 별도의 URL을 사용하는 것은 완전히 괜찮습니다. 실제로, RESTful API를 설계할 때, 다른 기능들과 마찬가지로 로그인 기능을 위한 별도의 엔드포인트(즉, URL)를 제공하는 것이 일반적입니다. 이 방식은 로그인 프로세스를 명확하게 분리하고 관리하기 쉽게 만들어 줍니다.

예를 들어, /api/login/ 이라는 URL 엔드포인트를 만들어서 로그인 요청을 처리할 수 있습니다. 사용자가 이 URL로 POST 요청을 보내면, 요청에 포함된 사용자 이름과 비밀번호를 검증한 후에, 올바른 자격 증명이면 사용자에게 토큰을 발급하여 로그인이 완료됩니다.

여기에 로그인 구현을 위한 간단한 예제 코드를 제시합니다:

# views.py
from django.contrib.auth import authenticate
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authtoken.models import Token

class LoginView(APIView):
    def post(self, request, *args, **kwargs):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(username=username, password=password)
        if user:
            token, created = Token.objects.get_or_create(user=user)
            return Response({"token": token.key})
        else:
            return Response({"error": "Wrong Credentials"}, status=400)

# urls.py
from django.urls import path
from .views import LoginView

urlpatterns = [
    path('api/login/', LoginView.as_view(), name='login'),
]

이 예제에서 LoginView 클래스는 사용자가 제공한 자격 증명을 검증하고, 올바른 경우에는 사용자에게 토큰을 발급합니다. 이 토큰은 클라이언트가 API에 대한 후속 요청을 인증하는 데 사용할 수 있습니다.

토큰을 받았을 때, 이를 자동으로 쿠키에 저장하는 것은 클라이언트 측(여기서는 리액트)의 책임입니다. 서버에서 토큰을 발급한 후 클라이언트로 전송하면, 클라이언트는 이 토큰을 받아서 쿠키, 로컬 스토리지, 세션 스토리지 등에 저장할 수 있습니다. 어디에 저장할지는 개발자가 결정해야 합니다.

쿠키에 토큰을 저장하는 것은 일반적으로 CSRF(Cross-Site Request Forgery) 공격에 노출될 수 있으므로, 보안을 고려하여 적절한 방법을 선택해야 합니다. 토큰을 쿠키에 저장하면 브라우저가 자동으로 쿠키를 요청에 포함시켜 보내므로 개발자가 매 요청마다 토큰을 명시적으로 설정할 필요가 없어 편리합니다. 하지만, 이 경우 CSRF 공격에 대한 보호 조치가 필요합니다.

리액트에서 토큰을 쿠키에 저장하는 방법은 아래와 같습니다:

  1. 서버로부터 토큰을 받은 후,
  2. document.cookie를 사용하거나 쿠키를 다루기 위한 라이브러리(예: js-cookie)를 사용하여 쿠키에 저장합니다.

예를 들어, js-cookie 라이브러리를 사용하여 토큰을 쿠키에 저장하는 코드는 다음과 같습니다:

import Cookies from 'js-cookie';

// 서버로부터 받은 토큰
const token = '서버로부터 받은 토큰';

// 쿠키에 토큰 저장
Cookies.set('token', token);

리액트 애플리케이션에서 API 요청을 할 때마다 이 쿠키를 함께 전송하여 서버에서 요청을 인증할 수 있습니다. 하지만, 보안상의 이유로 토큰을 로컬 스토리지나 세션 스토리지에 저장하는 것이 더 권장되기도 합니다. 이 경우, 매 요청마다 헤더에 토큰을 명시적으로 추가해야 합니다. 선택한 저장 방식에 따라 보안과 편의성 사이에서 적절한 균형을 찾아야 합니다.

GPT가 작성하였습니다.