[Vue] DRF Auth System

한결·2023년 5월 15일
0

WEB

목록 보기
58/63

DRF Auth System

Authentication & Authorization

Authentication - 인증, 입증

  • 자신이라고 주장하는 사용자가 누구인지 확인하는 행위
  • 모든 보안 프로세스의 첫 번째 단계 (가장 기본 요소)
  • 즉, 내가 누구인지를 확인하는 과정
  • 401 Unauthorized
    • 비록 HTTP 표준에서는 "미승인(unauthorized)"을 명확히 하고 있지만,
      의미상 이 응답은 "비인증(unauthenticated)"을 의미

Authorization - 권한 부여, 허가

  • 사용자에게 특정 리소스 또는 기능에 대한 액세스 권한을 부여하는 과정 (절차)

  • 보안 환경에서 권한 부여는 항상 인증이 먼저 필요함

    • 사용자는 조직에 대한 액세스 권한을 부여 받기 전에 먼저
      자신의 ID가 진짜인지 먼저 확인해야 함
  • 서류의 등급, 웹 페이지에서 글을 조회 & 삭제 & 수정 할 수 있는 방법, 제한 구역

    • 인증이 되었어도 모든 권한을 부여 받는 것은 아님
  • 403 Forbidden

    • 401과 다른 점은 서버는 클라이언트가 누구인지 알고 있음

Authentication and authorization work together

  • 회원가입 후, 로그인 시 서비스를 이용 할 수 있는 권한 생성
    • 인증 이후에 권한이 따라오는 경우가 많음
  • 단, 모든 인증을 거쳐도 권한이 동일하게 부여되는 것은 아님
    • Django에서 로그인을 했더라도
      다른 사람의 글까지 수정/삭제가 가능하진 않음
  • 세션, 토큰, 제 3자를 활용하는 등의 다양한 인증 방식이 존재

Authentication determined

인증 여부 확인 방법

  • DRF 공식문서에서 제안하는 인증 절차 방법

  • BasicAuthentication, Session Authentication는 뭘까?

  • settings.py에 작성하여야 할 설정

    • "기본적인 인증 절차를 어떠한 방식으로 둘 것이냐"를 설정하는 것

    • 예시의 2가지 방법 외에도 각 framework마다 다양한 인증 방식이 있음

  • 우리가 사용할 방법은 DRF가 기본으로 제공해주는 인증 방식 중 하나인
    TokenAuthentication

  • 모든 상황에 대한 인증 방식을 정의하는 것이므로,
    각 요청에 따라 다른 인증 방식을 거치고자 한다면 다른 방식이 필요

  • view 함수마다 (각 요청마다) 다른 인증 방식을 설정하고자 한다면 decorator 활용

  • [참고] permission_classes
    • 권한 관련 설정
    • 권한 역시 특정 view 함수마다 다른 접근 권한 요구할 수 있음

다양한 인증 방식

  • BasicAuthentication

    • 가장 기본적인 수준의 인증 방식

    • 테스트에 적합

  • SessionAuthentication

    • Django에서 사용하였던 session 기반의 인증 시스템
    • DRF와 Django의 session 인증 방식은 보안적 측면을 구성하는 방법에 차이가 있음
    • 출입 명부를 갖고있다 생각하면 됨
      -> 명단이 늘어나면 서버에 부하
  • RemoteUserAuthentication

    • Django의 Remote user 방식을 사용할 때 활용하는 인증 방식
  • TokenAithentication

    • 매우 간단하게 구현 가능
    • 기본적인 보안 기능 제공
    • 다양한 외부 패키지가 있음
    • 외부 API 사용할 때 사용
    • 출입증 - 토큰
      -> 토큰이 맞나 확인만 하면됨
      -> 서버에 부하 없음
    • 단점
      • 클라이언트 토큰 탈취
        -> 해킹의 위험이 있음
      • 세션은 문자열 한줄이라면 토큰은 보내야할 정보가 많음
        -> 네트워크에 부하
      • 발급만 해주면 끝이기 때문에 기기 접속 제한이 어려움
        -> 시간 제한을 걸어둠
  • (중요) settings.py에서 DEFAULT_AUTHENTICATION_CLASSES를 정의
    • TokenAuthentication 인증 방식을 사용할 것임을 명시

TokenAithentication 사용 방법

  • INSTALLED_APPS에 rest_framework.authtoken 등록
  • 각 User 마다 고유 Token 생성

  • 생성한 Token을 각 User에게 발급

    • User는 발급 받은 Token을 요청과 함께 전송
    • Token을 통해 User 인증 및 권한 확인
  • Token 발급 방법

def some_view_func(request):
	token = Token.objects.create(user=...)
    return Response({'token':token.key})
  • User는 발급 받은 Token을 headers에 담아 요청과 함께 전송
    • 단, 반드시 Token 문자열 함께 삽입
      • 삽입해야 할 문자열은 각 인증 방식 마다 다름(ex. Bearer, Auth, JWT 등)
    • 주의) Token 문자열과 발급받은 실제 token 사이를 ' '공백으로 구분
  • Authorization HTTP headers 작성방법

토큰 생성 및 관리 문제점

  • 기본 제공 방식에서 고려하여야 할 사항들
    1. Token 생성 시점
    2. 생성한 Token 관리 방법
    3. User와 관련된 각종 기능 관리 방법
      • 회원가입
      • 로그인
      • 회원 정보 수정
      • 비밀 번호 변경 등...

dj-rest-auth

dj-rest-auth

  • 회원가입, 인증(소셜미디어 인증 포함), 비밀번호 재설정, 사용자 세부 정보 검색,
    회원정보 수정 등을 위한 REST API end point 제공

  • 주의) django-rest-auth는 더 이상 업데이트를 지원하지 않음 dj-rest-auth 사용

  • https://github.com/iMerica/dj-rest-auth

dj-rest-auth 사용 방법

  1. 패키지 설치
  2. App 등록
  3. url 등록

dj-rest-auth 사용 하기

  • dj-rest-auth 설치
    pip install dj-rest-auth

  • my_api/settings.py

  • my_api/urls.py

  • 결과 확인

    • 회원가입 기능 없음
  • 공식 문서로 이동

    • Registration(optional) 확인

Registration

  • Registration 기능을 사용하기 위해 추가 기능 등록 및 설치 필요

    • dj-rest-auth는 소셜 회원가입을 지원한다.
    • dj-rest-auth의 회원가입 기능을 사용하기 위해서는 django-allauth 필요
  • django-allauth 설치
    pip install 'dj-rest-auth[with_social]'

0개의 댓글