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. 토큰 발급 및 사용 흐름
- 사용자 인증:
- 클라이언트가 사용자 이름과 비밀번호를 /api-token-auth/ 엔드포인트로 POST 요청을 보낸다.
- 토큰 반환:
- 인증 성공 시, 서버는 고유한 토큰 문자열을 응답으로 반환한다.
- 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 Authentication과 OAuth Authentication(주로 OAuth2)에 대해, 각각의 특징과 장단점을 비교한다. 이들은 REST API 환경에서 주로 사용되며, 사용자 인증 및 권한 부여의 방식이 다르다.
1. Token Authentication
개념
- 사용자 인증이 성공하면 서버가 고유한 **토큰(Token)**을 생성하여 클라이언트에 반환.
- 클라이언트는 이후 요청에 이 토큰을 포함하여 서버와 통신.
- Django에서는 주로 rest_framework.authtoken을 사용하여 구현.
장점
- 구현이 간단:
- 설정과 사용이 간단하며 Django REST framework에서 바로 사용할 수 있음.
- 비상태성:
- 서버는 상태를 유지하지 않으며, 데이터베이스에 토큰만 저장.
- 스케일링(수평 확장)에 적합.
- 빠른 인증:
- 클라이언트가 받은 토큰을 요청에 포함하면, 빠르게 인증 처리 가능.
단점
- 보안 약점:
- 토큰이 탈취되면 즉시 인증이 가능한 상태가 되어 위험.
- 토큰 만료(Expiration) 기능이 기본적으로 제공되지 않아, 별도로 구현해야 함.
- 갱신(Refresh) 문제:
- 한 번 생성된 토큰을 폐기하거나 갱신하는 기능이 기본 제공되지 않음.
- 권한 위임 부재:
- 사용자가 다른 애플리케이션에 권한을 위임하는 구조가 없음.
2. OAuth Authentication (OAuth2)
개념
- OAuth는 권한 부여를 위한 표준 프로토콜.
- 주로 소셜 로그인(Google, Facebook 등), 제3자 서비스 접근 권한 부여에 사용.
- Django에서는 django-oauth-toolkit 같은 라이브러리로 구현.
장점
- 권한 위임 가능:
- 사용자는 제3자 애플리케이션에 자신의 자원 접근 권한을 제한적으로 제공 가능.
- 예: 사용자 대신 API를 호출하여 데이터를 관리하도록 위임.
- 토큰 갱신(Refresh Token):
- Access Token이 만료되더라도 Refresh Token을 사용하여 새로운 토큰 발급 가능.
- 높은 보안성:
- 다양한 인증 시나리오와 보안 메커니즘 제공 (예: 클라이언트 ID/시크릿, 리다이렉션 URL 검증 등).
- 표준화된 방식:
- 많은 서비스와의 통합이 용이 (Google API, Facebook API 등).
단점
- 구현 복잡성:
- 프로토콜 자체가 복잡하며, 서버와 클라이언트 모두 설정해야 할 요소가 많음.
- 리소스 소모:
- 서버는 Access Token과 Refresh Token 등을 관리해야 하므로, 데이터베이스와 캐시를 활용한 추가적인 리소스가 필요.
- 학습 곡선:
- 초기 사용자는 OAuth의 플로우(Authorization Code, Implicit, Client Credentials 등)를 이해하는 데 시간이 걸림.
3. 장단점 비교
특징Token AuthenticationOAuth Authentication| 복잡성 | 간단함 | 구현이 복잡 |
| 보안성 | 상대적으로 낮음 | 높은 보안성 제공 |
| 토큰 관리 | 별도의 갱신 메커니즘 없음 | Refresh Token으로 토큰 갱신 가능 |
| 권한 위임 | 불가능 | 가능 |
| 적용 사례 | 단순 REST API 인증 | 소셜 로그인, 제3자 앱과의 권한 위임 |
| 표준화 여부 | Django REST framework 고유 방식 | OAuth2는 표준 프로토콜 |
| 스케일링 | 가볍고 비상태성으로 스케일링에 적합 | 상태 유지 필요, 스케일링 시 복잡성 증가 |
4. 어떤 인증 방식을 선택해야 할까?
- Token Authentication을 사용할 경우:
- 내부적으로 사용하는 API.
- 복잡한 권한 위임이나 토큰 갱신이 필요하지 않은 단순한 환경.
- 빠르고 간단하게 구현해야 하는 경우.
- 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 |
