[Authentication & Authorization]
Authentication - 인증, 입증
- 자신이라고 주장하는 사용자가 누구인지 확인하는 행위
- 모든 보안 프로세스의 첫 번째 단계(가장 기본 요소)
- 즉, 내가 누구인지를 확인하는 과정
- 401 Unauthorized
- 비록 HTTP 표준에서는 "미승인(unauthorized)"을 명확히 하고 있지만, 의미상 이 응답은 "비인증(unauthenticated)"을 의미
Authorization - 권한 부여, 허가
- 사용자에게 특정 리소스 또는 기능에 대한 액세스 권한을 부여하는 과정(절차)
- 보안 환경에서 권한 부여는 항상 인증이 먼저 필요함
- 사용자는 조직에 대한 액세스 권한을 부여받기 전에 먼저 자신의 ID가 진짜인지 먼저 확인해야 함
- 서류의 등급, 웹페이지에서 글을 조회 & 삭제 & 수정 할 수 있는 방법, 제한 구역
- 인증이 되었어도 모든 권한을 부여 받는 것은 아님
- 403 Forbidden
- 401과 다른 점은 서버는 클라이언트가 누구인지 알고 있음
Authentication and Authorization work together
- 회원가입 후, 로그인 시 서비스를 이용할 수 있는 권한 생성
- 단 모든 인증을 거쳐도 권한이 동일하게 부여되는 것은 아님
- Django에서 로그인을 했더라도 다른 사람의 글까지 수정/삭제가 가능하진 않음
- 세션, 토큰, 제 3자를 활용하는 등의 다양한 인증 방식이 존재
[Authentication determined]
다양한 인증 방식
- BasicAuthentication
- 가장 기본적인 수준의 인증 방식
- 테스트에 적합
- SessionAuthentication
- Django에서 사용하였던 session 기반의 인증 시스템
- DRF와 Django의 session 인증 방식은 보안적 측면을 구성하는 방법에 차이가 있음
- RemoteUserAuthentication
- Django의 Remote user 방식을 사용할 때 활용하는 인증 방식
- TokenAuthentication
- 매우 간단하게 구현할 수 있음
- 기본적인 보안 기능 제공
- 다양한 외부 패키지가 있음
[중요!] settings.py에서 DEFAULT_AUTHENTICATION_CLASSES를 정의
- TokenAuthentication 인증 방식을 사용할 것임을 명시
[TokenAuthentication 사용 방법]
- settings.py > INSTALLED_APPS에 rest_framework.authtoken 등록
- 생성한 Token을 각 User에게 발급
- User는 발급 받은 Token을 요청과 함께 전송
- Token을 통해 User 인증 및 권한 확인
- Token 발급 방법
- User는 발급 받은 Token을 headers에 담아 요청과 함께 전송
- 단, 반드시 Token 문자열 함께 삽입
- 삽입해야할 문자열은 각 인증 방식마다 다름(ex. Bearer, Auth, JWT 등)
- Token 문자열과 발급받은 실제 token 사이를 ' '(공백)으로 구분
- Authorization HTTP headers 작성 방법
토큰 생성 및 관리 문제점
- Token 생성 시점
- 생성한 Token 관리 방법
- User와 관련된 각종 기능 관리 방법
- 회원가입, 로그인, 회원 정보 수정, 비밀번호 변경 등..
[dj-rest-auth]
- 회원가입, 인증(소셜미디어 인증 포함), 비밀번호 재설정, 사용자 세부 정보 검색, 회원 정보 수정 등을 위한 REST API end point 제공
- django-rest-auth는 더 이상 업데이트를 지원하지 않음 ==> dj-rest-auth 사용
[dj-rest-auth] 사용 방법
- 패키지 설치
$ pip install 'dj-rest-auth[with_social]'
2.App 등록
- settings.py > INSTALLED_APPS에 'dj-rest-auth' 등록
- url 등록
[before start]
- 시작하기 전 auth.User를 accounts.User로 변경 필요
- settings.py > AUTH_USER_MODEL = 'accounts.User'
- auth.User로 설정된 DB제거
- dq.sqlite3 삭제
- migrations의 파일들 삭제
- my_api/settings.py에 추가
- App 등록 및 SITE_ID 설정
[SITE_ID]
- Django는 하나의 컨텐츠를 기반으로 여러 도메인에 컨텐츠를 게시 가능하도록 설계됨
- 다수의 도메인이 하나의 데이터베이스에 등록
- 현재 프로젝트가 첫번째 사이트임을 나타냄