본문 바로가기

코딩

토큰; Token of rest_framework

728x90
반응형

 

 

버스 토큰

 

 

rest_framework.authtoken은 Django REST framework에서 제공하는 **토큰 기반 인증(Token-Based Authentication)**을 구현하는 모듈이다. 이 모듈은 클라이언트가 API에 접근할 때, 토큰을 사용하여 인증하는 간단한 방법을 제공한다.


1. 주요 개념

  • 토큰 기반 인증:
    • 사용자가 로그인에 성공하면, 고유한 인증 토큰을 생성하여 클라이언트에 반환한다.
    • 클라이언트는 이후 요청마다 이 토큰을 포함해 서버에 전송하여 인증을 수행한다.
    • 주로 헤더에 토큰을 포함하여 API 요청을 보낸다.

2. 설치와 설정

rest_framework.authtoken을 사용하려면, Django 프로젝트에 모듈을 설치하고 설정해야 한다.

 

설치

INSTALLED_APPS에 추가

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
]

 

마이그레이션 수행 :

데이터베이스에 토큰 정보를 저장하는 테이블을 생성한다.

    python manage.py migrate

3. 주요 구성 요소

  • Token 모델:
    • 각 사용자에 대해 고유한 토큰이 저장되는 데이터베이스 모델이다.
    • 사용자와 1:1 관계를 가지며, 토큰 문자열과 생성 시간이 포함된다
from rest_framework.authtoken.models import Token

# 특정 사용자에 대한 토큰 가져오기 (또는 생성)
user_token, created = Token.objects.get_or_create(user=user_instance)

# 토큰 문자열
print(user_token.key)

 

 

  • TokenAuthentication 클래스:
    • DRF에서 인증을 처리하는 클래스.
    • 클라이언트가 보낸 요청 헤더에서 Authorization: Token <토큰 값>을 읽어 인증한다.
    • 인증에 실패하면 401 Unauthorized 응답을 반환한다
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

4. 토큰 발급 및 사용 흐름

  1. 사용자 인증:
    • 클라이언트가 사용자 이름과 비밀번호를 /api-token-auth/ 엔드포인트로 POST 요청을 보낸다.
  2. 토큰 반환:
    • 인증 성공 시, 서버는 고유한 토큰 문자열을 응답으로 반환한다.
  3. API 요청:
    • 클라이언트는 이후 모든 API 요청에 Authorization: Token <토큰> 헤더를 포함한다.

5. 엔드포인트 설정

REST framework는 기본적으로 토큰 인증을 위한 엔드포인트를 제공한다.

URL 설정

from rest_framework.authtoken import views
from django.urls import path

urlpatterns = [
    path('api-token-auth/', views.obtain_auth_token),
]

사용 예시

  • 요청
curl -X POST -d "username=admin&password=admin" http://127.0.0.1:8000/api-token-auth/

 

  • 응답
{"token": "abcd1234efgh5678ijkl9101mnopqrst"}

 


6. 주요 장점

  • 간단하게 API 인증을 구현할 수 있다.
  • 각 사용자에 고유한 토큰이 할당되므로, 유효성을 쉽게 확인 가능하다.
  • 서버와 클라이언트 간 상태 정보를 유지하지 않아도 되므로 stateless한 인증 방식이다.

7. 주의점

  • 토큰 보안:
    • 토큰이 노출되면, 누구나 해당 사용자의 권한으로 API에 접근할 수 있으므로 반드시 HTTPS를 사용해야 한다.
  • 토큰 관리:
    • 토큰은 기본적으로 만료 시간이 없으므로, 추가적인 만료 메커니즘을 수동으로 구현해야 한다.

8. 확장 사용

  • 사용자 로그인 시 토큰을 자동 생성하거나 만료 시 재발급하도록 커스터마이징 가능하다.
  • 토큰에 추가 정보를 포함하려면, Signal이나 커스텀 뷰를 활용할 수 있다.
from rest_framework.authtoken.models import Token
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

이 모듈은 소규모 프로젝트나 간단한 인증 시스템에 적합하며, 복잡한 보안 요건이 필요한 경우 OAuth2와 같은 더 강력한 인증 방법을 고려할 수 있다.

 


 

Django에서 제공하는 다양한 인증 방법들인 Token AuthenticationOAuth Authentication(주로 OAuth2)에 대해, 각각의 특징과 장단점을 비교한다. 이들은 REST API 환경에서 주로 사용되며, 사용자 인증 및 권한 부여의 방식이 다르다.


1. Token Authentication

개념

  • 사용자 인증이 성공하면 서버가 고유한 **토큰(Token)**을 생성하여 클라이언트에 반환.
  • 클라이언트는 이후 요청에 이 토큰을 포함하여 서버와 통신.
  • Django에서는 주로 rest_framework.authtoken을 사용하여 구현.

장점

  1. 구현이 간단:
    • 설정과 사용이 간단하며 Django REST framework에서 바로 사용할 수 있음.
  2. 비상태성:
    • 서버는 상태를 유지하지 않으며, 데이터베이스에 토큰만 저장.
    • 스케일링(수평 확장)에 적합.
  3. 빠른 인증:
    • 클라이언트가 받은 토큰을 요청에 포함하면, 빠르게 인증 처리 가능.

단점

  1. 보안 약점:
    • 토큰이 탈취되면 즉시 인증이 가능한 상태가 되어 위험.
    • 토큰 만료(Expiration) 기능이 기본적으로 제공되지 않아, 별도로 구현해야 함.
  2. 갱신(Refresh) 문제:
    • 한 번 생성된 토큰을 폐기하거나 갱신하는 기능이 기본 제공되지 않음.
  3. 권한 위임 부재:
    • 사용자가 다른 애플리케이션에 권한을 위임하는 구조가 없음.

2. OAuth Authentication (OAuth2)

개념

  • OAuth는 권한 부여를 위한 표준 프로토콜.
  • 주로 소셜 로그인(Google, Facebook 등), 제3자 서비스 접근 권한 부여에 사용.
  • Django에서는 django-oauth-toolkit 같은 라이브러리로 구현.

장점

  1. 권한 위임 가능:
    • 사용자는 제3자 애플리케이션에 자신의 자원 접근 권한을 제한적으로 제공 가능.
    • 예: 사용자 대신 API를 호출하여 데이터를 관리하도록 위임.
  2. 토큰 갱신(Refresh Token):
    • Access Token이 만료되더라도 Refresh Token을 사용하여 새로운 토큰 발급 가능.
  3. 높은 보안성:
    • 다양한 인증 시나리오와 보안 메커니즘 제공 (예: 클라이언트 ID/시크릿, 리다이렉션 URL 검증 등).
  4. 표준화된 방식:
    • 많은 서비스와의 통합이 용이 (Google API, Facebook API 등).

단점

  1. 구현 복잡성:
    • 프로토콜 자체가 복잡하며, 서버와 클라이언트 모두 설정해야 할 요소가 많음.
  2. 리소스 소모:
    • 서버는 Access Token과 Refresh Token 등을 관리해야 하므로, 데이터베이스와 캐시를 활용한 추가적인 리소스가 필요.
  3. 학습 곡선:
    • 초기 사용자는 OAuth의 플로우(Authorization Code, Implicit, Client Credentials 등)를 이해하는 데 시간이 걸림.

3. 장단점 비교

특징Token AuthenticationOAuth Authentication
복잡성 간단함 구현이 복잡
보안성 상대적으로 낮음 높은 보안성 제공
토큰 관리 별도의 갱신 메커니즘 없음 Refresh Token으로 토큰 갱신 가능
권한 위임 불가능 가능
적용 사례 단순 REST API 인증 소셜 로그인, 제3자 앱과의 권한 위임
표준화 여부 Django REST framework 고유 방식 OAuth2는 표준 프로토콜
스케일링 가볍고 비상태성으로 스케일링에 적합 상태 유지 필요, 스케일링 시 복잡성 증가

4. 어떤 인증 방식을 선택해야 할까?

  1. Token Authentication을 사용할 경우:
    • 내부적으로 사용하는 API.
    • 복잡한 권한 위임이나 토큰 갱신이 필요하지 않은 단순한 환경.
    • 빠르고 간단하게 구현해야 하는 경우.
  2. OAuth Authentication을 사용할 경우:
    • 제3자 앱과의 통합이 필요한 경우.
    • 소셜 로그인이 필요하거나, 사용자에게 권한 위임을 제공해야 할 때.
    • 보안과 유연성이 중요한 애플리케이션.

결론적으로, 단순한 REST API 인증이라면 Token Authentication이 적합하며, 외부 서비스와의 통합이나 보안 강화가 필요하다면 OAuth Authentication이 더 적합하다. 필요에 따라 두 방식을 혼합해서 사용할 수 있다.

728x90
반응형

'코딩' 카테고리의 다른 글

Bearer 토큰  (0) 2024.12.14
rest.api 토큰 이터페이스 구현  (1) 2024.12.14
세션; Session  (2) 2024.12.13
인증과 권한; Authentication and Permissions  (0) 2024.12.12
오버라이딩; Overriding  (2) 2024.12.12