https://django-ninja.rest-framework.com/tutorial/authentication/
Django Ninja에서 제공하는 Authentication 기능이다. 다양한 방식의 Authentication을 제공하는데 JWT(JASON Web Token)으로 하는 방법에 대해서 간단 정리하려고 한다.
일단 OAuth에 대해서 잠깐 집고 넘어가자.
OAuth 2.0(Open Authorization 2.0, OAuth2)은 인증을 위한 개방형 표준 프로토콜입니다.
이 프로토콜에서는 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다.
[출처] OAuth 2.0 동작 방식의 이해|작성자 한컴인텔리전스
OAuth에 대해선 위 블로그에 자세하게 나와있다. 내용을 전부 알고 있으면 좋겠지만 이번 포스팅의 주제에 벗어나므로 간단하게 흐름도만 파악하고 넘어가려고 한다.
Google의 로그인 기능을 사용하기 위해서는 Client가 Google에 Access Token을 요청하고 전달 받는다. 물론 Token을 요청하고 받기 위해서는 미리 설정을 해줘야한다. Google의 개발자 콘솔이 그것이다.
과거에는 AJax를 이용하여 비동기 통신을 했지만 최근에는 SPA인 Vue나 React를 이용하여 Frontend와 Backend를 분리해서 구축한다. 로그인 요청은 Frontend에서 하기 때문에 개발자 콘솔에서 URL 설정은 Frontend의 URL주소로 설정해줘야한다.
원본은 Frontend URL, 리디렉션에는 Login 기능이 있는 URL를 적어주면 된다.
Frontend와 Backend에서 정보를 주고 받을 때 사용하는 것이 JWT이다. Bearer 보안으로 이루어져있는데 Django Ninja에서는 이 토큰을 받고 Authentication을 처리해주는 기능을 제공한다.
from ninja.security import HttpBearer
class AuthBearer(HttpBearer):
def authenticate(self, request, token):
if token == "supersecret":
return token
@api.get("/bearer", auth=AuthBearer())
def bearer(request):
return {"token": request.auth}
API auth에 Authentication 방식을 설정해놓으면 API를 실행하기 전에 관련 Authentication Class를 통과한 다음 실행한다. authenticate의 token이 API요청 클라이언트에 포함되어 있는 Bearer token을 파싱해서 가져온다.
token에는 유저의 정보가 들어있다.
import jwt
from rest_framework_simplejwt import settings
payload = jwt.decode(jwt=token, key=settings.DEFAULTS['SIGNING_KEY'], algorithms=settings.DEFAULTS['ALGORITHM'])
user_id = payload['user_id']
Google Social Login을 위해 이미 만들어져 있는 라이브러리를 사용하기 위해 로그인 기능만 REST FRAMEWORK를 사용했다. Django Setting에 들어가보면 secret key가 있는데 암호화를 사용할 때 사용하는 중요한 정보이다. Wagtail에서는 dev.py에 있다. key는 Django Secret key를 사용하면 되고 알고리즘은 "HS256"을 사용하는데 설정 값을 가져와서 넣는 것이 안전하다.
'Back-End' 카테고리의 다른 글
Django Migrations오류 (0) | 2021.12.15 |
---|