Implementing Logging for Signing in, at django `graphene_jwt`

Implementing Logging for Signing in, at django `graphene_jwt`
Westminster Bridge, London, UK 🇬🇧

개요

2020년에 진행했던 회사 프로젝트 중에 DjangoGraphQL을 사용한 프로젝트가 있었다. 사용자의 이용 기록을 저장해야 할 필요가 있던 프로젝트라 사용자가 로그인하는 것을 포함해서 행위를 기록하는 기능을 추가해야했다. 근데 누군가 만들어 둔 패키지에는 로깅 기능을 별도로 추가할 수 있는 기능은 없었고, 이것을 어떻게 해결했는지 기록하는 글이다.

본문

빠르게 개발할 필요가 있던 프로젝트라, 서비스 자체를 구현하지 않고 Django와 GraphQL로 백엔드를 연동했다. Django의 django-graphene 패키지로 GraphQL 서비스를 구현했고, 로그인하는 기능은 django-graphene-jwt 패키지를 사용했다. JWT 토큰을 생성하는 뮤테이션은 django-graphene-jwt를 통해 아래와 같이 등록한다.

Django JWT 등록 코드

인증 기록을 위해서 JWT 인증 패키지의 미들웨어가 있었으면 좋겠다고 생각했는데 아무리 찾아봐도 그런 기능이 없는 것 같았다. 그래서 생각한 방법이 두가지가 있었다.

  1. Django 자체의 미들웨어 기능을 사용하여 로그인하는 뮤테이션을 실행하려고 하는 것을 확인하고 로깅한다.
  2. graphql_jwt.ObtainJSONWebToken 클래스를 상속받아서 로그인하는 코드를 실행한 뒤 별도의 로깅 코드를 실행한다.

첫번째 방법은 코드가 로그인할 때만 실행되는 것이 아니기 때문에 비효율적이라고 생각했다. 그래서 두번째 방법을 택했다.

그래서 ObtainJSONWebToken 클래스가 정의되어 있는 graphql_jwt 패키지를 분석해보기로 했다. graphql_jwt 패키지의 mutations.py 파일을 보면, ObtainJSONWebToken 클래스는 아래와 같이 선언되어 있었다.

mutations.py 코드 일부

JSONWebTokenMutaion 클래스 내부에서 mutate() 라는 메소드를 실행시켜서 로그인을 구현해놓은 것을 확인할 수 있었다.

다시 GraphQL 선언부로 돌아가서 graphql_jwt.ObtainJSONWebToken 클래스를 상속받아 위와 같은 클래스를 만들었다. mutate()를 Override 해서 super().mutate() 로 기존 ObtainJSONWebToken 클래스의 뮤테이션 코드를 실행시키고 그 다음에 로깅 로직을 추가했다.

그리고 다시 graphene의 선언부를 아래와 같이 Custom ObtainJSONWebToken 클래스로 변경해주면 된다.

별거 아니지만 그동안 라이브러리 코드를 직접 분석해서, 그리고 분석한 내용을 바탕으로 상속을 통해 문제를 해결해 볼 생각을 못했기 때문에 기록해두려고 블로그에 글을 쓰게 됐다. 라이브러리를 분석하고 Override하는 것이 되려 효율적인 경우도 있다는 사실을 깨달았다.