인증은 사용자 데이터를 처리하는 모든 앱의 초석입니다. 이를 통해 사용자는 앱 내에서 개인 정보를 유지하면서 등록을 통해 제공되는 모든 기능에 액세스할 수 있습니다.
Django REST Framework(DRF)를 사용하면 선택할 수 있는 4가지 인증 클래스가 있습니다 .
BasicAuthentication
RemoteUserAuthentication
SessionAuthentication
TokenAuthentication
BasicAuthentication
의 경우에는 요청마다 client에서 user의 credentials을 보내게 됩니다. 이 경우 보안에 취약하여 유저 정보 노출 될 확률이 높습니다.
RemoteUserAuthentication
은 사용자의 신원 확인 책임을 제3자에게 수행하게 됩니다. 대부분의 경우 타사는 LDAP, CAS 또는 SAML과 같은 프로토콜을 지원하는 중앙 집중식 단일 로그인 서버입니다.
LDAP, CAS, SAML은 모두 인증 프로토콜이며, 사용자 인증 및 권한 부여를 위한 목적으로 사용됩니다.
LDAP (Lightweight Directory Access Protocol)
LDAP는 경량 디렉터리 접근 프로토콜로, 디렉터리 정보를 조회 및 수정하는 프로토콜입니다. 사용자 인증 및 권한 부여를 위한 프로토콜은 아니지만, LDAP를 이용한 사용자 인증 및 권한 부여를 구현한 시스템들이 많이 있습니다.
LDAP는 트리 구조의 디렉터리 구조를 사용합니다. 디렉터리 구조에서 각 노드는 항목(entry)으로 표현되며, 항목은 다양한 속성(attribute)으로 구성됩니다. LDAP 서버에는 다양한 속성 정보가 저장되어 있으며, 사용자 인증을 위해서는 일반적으로 사용자 이름과 비밀번호를 확인합니다.
CAS (Central Authentication Service)
CAS는 웹 환경에서 싱글 사인온(SSO)을 구현하기 위한 프로토콜입니다. 사용자 인증 및 권한 부여를 위한 프로토콜입니다.
CAS는 클라이언트와 CAS 서버 간의 프로토콜로, 클라이언트는 CAS 서버로 사용자 이름과 비밀번호를 전송합니다. CAS 서버는 사용자 정보를 검증한 후, 성공적으로 검증되면 클라이언트에게 티켓(ticket)을 발급합니다. 클라이언트는 이 티켓을 서비스 제공자(SP)에게 전송하여 인증 및 권한 부여를 받습니다.
SAML (Security Assertion Markup Language)
SAML은 웹 환경에서 싱글 사인온(SSO)을 구현하기 위한 프로토콜입니다. 사용자 인증 및 권한 부여를 위한 프로토콜입니다.
SAML은 클라이언트와 서비스 제공자(SP) 간의 프로토콜로, 클라이언트는 SAML 서비스 제공자(SP)에게 인증 요청을 보냅니다. SAML 서비스 제공자(SP)는 클라이언트에게 SAML 응답(assertion)을 반환합니다. 이 SAML 응답(assertion)은 클라이언트에 대한 사용자 정보 및 권한 정보를 포함하고 있습니다. 클라이언트는 이 정보를 이용하여 다른 서비스 제공자(SP)에 대한 인증 및 권한 부여를 받습니다.
LDAP, CAS, SAML은 모두 인증 프로토콜이며, 각각의 차이점은 다음과 같습니다.
목적: LDAP는 디렉터리 서비스용, CAS는 SSO용, SAML은 클라우드 및 SSO용
구현 방법: LDAP는 X.500 디렉터리 서비스 프로토콜을 기반으로 하며, CAS는 웹 애플리케이션 서버와 티켓 서버를 연결하여 구현하며, SAML은 XML 기반 교환 프로토콜을 기반으로 합니다.
사용 방법: LDAP는 주로 내부 인증 및 권한 관리에 사용되며, CAS는 SSO를 제공하기 위한 프로토콜로 사용되며, SAML은 클라우드 애플리케이션 및 SSO를 지원하기 위해 사용됩니다
Django REST Framework의 세션 인증
과 djangorestframework-simplejwt의 JWTAuthentication
클래스를 모두 사용하도록 설정하겠습니다.
모바일과 데스크톱 브라우저를 모두 지원해야 합니다. 세션 인증은 서버 렌더링 정적 관리 사이트에 적합한 선택이며 토큰 인증은 API 인증에 이상적인 옵션입니다. server/taxi/settings.py 파일 하단에 다음을 추가합니다.
# server/taxi/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=60),
'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
'USER_ID_CLAIM': 'id',
}