<aside> 💡 #authentication #authorization #oauth #login #logout #is_authenticated #token #cookie
</aside>
인증과 인가에 대한 소개
사이버 공격과 개인 정보 유출이 범람하는 현대에 있어 보안은 가장 중요한 요소 중 하나 입니다. 그 중에서도 인증과 인가라는 요소는 웹 애플리케이션 보안에 있어 핵심적인 역할을 수행한다고 할 수 있습니다. 인증과 인가, 이 둘은 비슷해 보이면서도 다른 역할을 맡고 있습니다. 이 섹션에서는 인증과 인가의 간단한 개념에 대해 소개하고, Django에서 제공하는 인증과 인가에 대해 알아보도록 하겠습니다.
인증과 인가에 대한 개요
인증은 사용자 신원을 확인하는 절차를 말하는 것으로, 현재 웹 애플리케이션에 접근하는 사용자가 정말 자신이 주장하는 그 사용자인지를 확인하겠다는 것입니다. 이러한 과정을 통해 인증되지 않은 사용자가 민감 정보나 시스템에 무단으로 접근하는 것을 예방할 수 있습니다. 인증을 위해 사용되는 인증 정보로는 사용자명 · 이메일 · 전화번호 · 지문 · 토큰 등이 있습니다.
인가는 인증된 사용자에 대해 적절한 권한을 부여하여 웹 애플리케이션 내에서 어떤 동작을 수행할 수 있는지를 결정하는 절차를 말하는 것으로, 현재 웹 애플리케이션의 특정 기능에 접근하려는 사용자가 해당 기능에 대한 권한을 가지고 있는지를 확인하겠다는 것입니다. 예를 들어, 관리자는 다른 모든 사용자의 정보에 접근할 수 있어야 하지만 일반적인 사용자는 다른 사용자의 정보에 접근할 수 없어야 한다는 것입니다.
이렇게 서술하면 분명하게 나누어진 개념인 것 같지만, 사실 어떨 때에는 인증을 위한 장치가 인가의 역할을 수행할 때도 있고, 인가를 위한 장치가 인증의 역할을 수행할 때도 있습니다. 중요한 것은 이러한 과정들이 애플리케이션의 기능 및 사용자 정보를 보호하는 데 중요한 역할을 한다는 것입니다.
Django에서 제공하는 인증과 인가
Django MTV 패턴을 기반으로 한 프레임워크로, 편리하고 강력한 인증 · 인가 기능을 제공합니다. 인증을 위해 제공하는 기능으로는 사용자 모델 · 회원가입 · 로그인 · 로그아웃과 같은 것이 있습니다. 그 중 가장 기본이 되는 것은 역시 사용자 모델로, 이 사용자 모델을 기반으로 사용자의 신원을 확인하고 인증을 부여하는 등의 기능이 작동하게 됩니다. 인가를 위해 제공하는 기능으로는 권한 관리가 있습니다. 권한 관리의 경우, 사전 정의된 권한이 있으며 이 권한을 각 사용자 개인별로 부여할 수 있는 기능을 말합니다. 또는 논리적인 단위로 사용자를 묶은 다음 특정 단위에 대해 권한을 부여할 수도 있습니다. 이러한 권한을 바탕으로 특정 기능이나 데이터에 접근할 수 있는 인가 기능이 작동하게 됩니다. Django에서 제공되는 기능들은 그 자체로도 충분히 강력하고 편리하지만, 또 개발자의 편의나 요구에 맞게 커스텀 할 수 있는 유연함도 갖추고 있습니다. 다음 섹션에서는 각 기능에 대해 알아볼텐데, 현재 프로젝트에서는 인증에 대해서만 진행했으므로 해당 기능들에 대해서만 소개하겠습니다.
Django의 인증 기능
Django에서 제공하는 인증과 관련된 기능들을 조금 더 자세히 알아보겠습니다. 앞서 말했듯 사용자 모델과 인증에 사용되는 함수 두 가지에 대해 알아볼 것입니다. 이러한 기능들은 모두 Django가 제공하는 것이며, 구현이 간편하고 유연하며 동시에 강력한 보안을 제공한다는 장점이 있습니다.
사용자 모델
from django.db import models
from django.contrib.auth.models import AbstractUser, AbstractBaseUser
# AbstractBaseUser를 활용하는 경우
class User(AbstractBaseUser):
email = models.EmailField(verbose_name='email address', max_length=255, unique=True)
nickname = models.CharField(max_length=255)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['nickname']
우선 기본이 되는 요소인 사용자 모델입니다. django.contrib.auth.models
모듈의 AbstractUser
나 AbstractBaseUser
클래스를 통해 사용자 모델을 생성할 수 있습니다. 이러한 모델들은 기본적으로 제공되는 필드들이 있는데다 입력 받을 데이터에 맞게 제약 조건도 걸려 있고 어떤 필드로 인증을 시도할지가 정해져 있는 등 별도로 신경 써야 할 것들이 많지 않도록 되어 있습니다. 이러한 클래스들을 활용할 때에는 settings.py
의 AUTH_USER_MODEL
설정을 통해 어떤 사용자 모델을 사용하고 있는지에 대해 Django에게 알려주는 과정을 거쳐야 합니다.