Today I Learned 56 - Django / DRF Auth System

angie·2022년 11월 15일
0

Django

목록 보기
3/3
post-thumbnail

장고는 오랜만이므로 DRF에 대한 복습 먼저

1. DRF?

  • Django Rest Framework

1) RESTful

RESTful API

  • 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스
  • REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스

REST

  • Representational State Transfer(REST)
  • 프로토콜이나 표준이 아닌 아키텍처 원칙 세트
  • RESTful API를 통해 요청이 수행되면 RESTful API는 리소스 상태에 대한 '표현'을 요청자에게 전송
  • 이 정보에 대한 '표현'은 HTTP: JSON, HTML, XLT 또는 일반 텍스트의 형식으로 전송

RESTful이 되기 위한 조건

  • 클라이언트, 서버 및 리소스로 구성
  • 요청이 HTTP를 통해 관리되는 클라이언트-서버 아키텍처
  • stateless 클라이언트-서버 커뮤니케이션 : 요청 간에 클라이언트 정보가 저장되어 유지되지 않음
    등등

정리!

RESTful이란 Representational State Transfer의 줄임말로, HTTP의 URL과 method(GET< POST, PUT, DELETE)를 사용해 API 가독성을 높인 구조화된 시스템 아키텍처

2) DRF

  • Django Rest Framework
  • Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리

DRF를 사용하는 이유

  1. 웹 브라우저 API는 범용성이 크다. 개발을 쉽게 만들어준다.
  2. 인증 정책에 OAuth1, OAuth2를 위한 추가적인 패키지가 추가되어 있는 경우
  3. 시리얼라이즈 기능을 제공해준다. (DB data > JSON)
  4. 문서화 및 커뮤니티 지원이 잘 되어있다.

2. DRF Auth System

1) Authentication & Authorization

Authentication

  • 인증
  • 자신이라고 주장하는 사용자가 누구인지 확인하는 행위
  • 모든 보안 프로세스의 첫 번째 단계
  • 즉, 내가 누구인지를 확인하는 과정
  • 에러메세지 : 401 Unauthorized

Authorization

  • 권한 부여
  • 사용자에게 특정 리소스 또는 기능에 대한 액세스 권한을 부여하는 과정
  • 보안 환경에서 권한 부여는 항상 인증이 먼저 필요함
    • 사용자는 조직에 대한 액세스 권한을 부여 받기 전에 먼저 자신의 ID가 진짜인지 먼저 확인해야함
  • 서류의 등급, 웹 페이지에서 글을 조회, 삭제, 수정할 수 있는 방법
  • 에러메세지 : 403 forbidden
    • 401과 다른 점은 서버는 클라이언트가 누구인지 알고 있음

2) How Authentication is determined

인증 방식 설정

  • 디폴트 인증방식을 사용할 수 있음
  • settings.py에서 기본적인 인증 절차를 어떠한 방식으로 할 것인지를 결정
# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

각 요청에 따라 다른 인증 방식을 거치고 싶을 때는 특정 View 함수마다 다른 decorator를 활용할 수 있다.

@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
    content = {
        'user': str(request.user),  # `django.contrib.auth.User` instance.
        'auth': str(request.auth),  # None
    }
    return Response(content)

다양한 인증 방식

1. BasicAuthentication

  • 사용자의 이름과 비밀번호에 대해 서명된 HTTP 기본 인증을 사용
  • 테스트에 적합

2. TokenAuthentication

  • 토큰 기반 HTTP 인증 방식을 사용
  • 클라이언트와 서버의 셋업에 적합
  • 매우 간단한 구현
  • 기본적인 보안 기능 제공
  • 다양한 외부 패키지가 있음

settings.py에서 'DEFAULT_AUTHENTICATION_CLASSES' 정의할 때 TokenAuthentication를 사용할 것을 명시해야한다!

3. SessionAuthentication

  • 세션 기반 인증 시스템

4. RemoteUserAuthentication

  • django의 remote user 방식을 사용할 때 활용하는 인증 방식

3) TokenAuthentication 사용 방법

(1) settings.py에 등록

# settings.py

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

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        #...
    ]
}

settings.py를 수정한 후에 migrate를 잊지 말고 실행할 것

(2) 각 유저마다 고유 token을 생성

from rest_framework.authtoken.models import Token

token = Token.objects.create(user=...)
print(token.key)
  • 각 유저에게 토큰을 발급하고, 토큰과 함께 요청을 서버로 전송
  • 서버는 요청 안에 함께 받은 토큰을 통해 유저의 인증 및 권한을 확인

코드 예시

# views.py

def some_view_func(request):
	token = Token.objects.create(user=...)
    return Response({ 'token' : token.key })

(3) Token을 요청의 headers에 담아 서버로 전송

  • 반드시 'Token' 문자열과 함께 삽입 (인증 방식마다 다르므로 확인 필요)

예시

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

HTTP 헤더키 앞에 문자열 리터럴 "Token"을 붙여야 하며 공백으로 두 문자열을 구분해야한다.

profile
better than more

0개의 댓글