[Django] Authentication system 1

Jingi·2024년 4월 1일

Web

목록 보기
14/40
post-thumbnail
  • 우리가 서버로부터 받은 페이지를 둘러볼 때 우리는 서버와 서로 연결되어 있는 상태가 아니다.
  • 목적 : 서버와 클라이언트 간의 '상태'를 유지

HTTP

  • HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 규약
  • 웹(WWW)에서 이루어지는 모든 데이터 교환의 기초

HTTP 특징

  • 비 연결 지향(connectionless)
    • 서버는 요청에 대한 응답을 보낸 후 연결을 끊음
  • 무상태(stateless)
    • 연결을 끊는 순간 클라이언트와 서버 간의 통시이 끝나며 상태 정보가 유지되지 않음
  • 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각
  • 클라이언트 측에서 저장되는 작은 데이터 파일이며, 사용자 인증, 추적, 상태 유지 등에 사용되는 데이터 저장 방식
  • 브라우저는 쿠키를 KEY-VALUE의 데이터 형식으로 저장
  • 쿠키를 저장해 놓았다가, 동인한 서버에 재요청 시 저장된 쿠키를 함께 전송
  • 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용됨
    • 이를 이용해 사용자의 로그인 상태를 유지
    • 상태가 없는 HTTP 프로토콜에서 상태 정보를 기억시켜 주기 때문
  • 세션 관리
    • 로그인, 아이디 자동완성, 공지 하루 안 보기 등
  • 개인화
    • 사용자 선호, 테마 등의 설정
  • 트래킹
    • 사용자 행동을 기록 및 분석

Session

  • 서버 측에서 생성되어 클라이언트와 서버 간의 상태를 유지 상태 정보를 저장하는 데이터 저장 방식
  • 쿠키에 세션 데이터를 저장하여 매 요청시마다 세션 데이터를 함께 보냄

Session 작동 원리

  • 클라이언트가 로그인을 하면 서버가 session 데이터를 생성 후 저장
  • 생성된 session 데이터에 인증 할 수 있는 session id를 발급
  • 발급한 session id를 클라이언트에게 응답
  • 클라이언트는 응답 받은 session id를 쿠키에 저장
  • 클라이언트가 다시 동일한 서버에 접속하면 요청과 함께 쿠키를 서버에 전달
  • 쿠키는 요청 때마다 서버에 함께 전송 되므로 서버에서 session id를 확인해 로그인 되어있다는 것을 알도록 함
  • Session cookie
    • 현재 세션이 종료되면 삭제됨
    • 브라우저 종료와 함께 세션이 삭제됨
  • Persistent cookies
    • Expires 속성에 지정된 날짜 혹은 Max-Age 속성에 지정된 기간이 지나면 삭제됨

Authentication system

  • 사용자 인증과 관련된 기능을 모아 놓은 시스템

Authentication

  • 사용자가 자신이 누구인지 확인하는 것

Custom User model 대체하기

  • django가 기본적으로 제공하는 User model이 아닌 직접 작성한 User model을 사용하기 위해

User 클래스를 대체하는 이유

  • 우리는 지금까지 별도의 User 클래스 정의 없이 내장된 auth 앱에 작성된 User 클래스를 사용했음
  • 별도의 설정 없이 사용할 수 있어 간편하지만, 개발자가 직접 수정할 수 없는 문제가 존재

AUTH_USER_MODEL

  • Django 프로젝트의 User를 나타내는 데 사용하는 모델을 지정

프로젝트 시작 시 반드시 User 모델을 대체해야 한다

  • Django는 새 프로젝트를 시작하는 경우 커스텀 User 모델을 설정하는 것을 강력하게 권장
  • 커스텀 User 모델은 기본 User 모델과 동일하게 작동 하면서도 필요한 경우 나중에 맞춤 설정할 수 있기 때문

Login & Logout

Login

  • Session을 Create하는 과정

AuthenticationForm()

  • 로그인 인증에 사용할 데이터를 입력받는 built-in form
# accounts/urls.py
app_name = 'accounts'
urlpatterns = [
    path('login/', views.login, name='login'),
]
<h1>로그인</h1>
<form action="{% url 'accounts:update' %}" method = "POST">
    {% csrf_token %}
    {{form.as_p}}
    <input type = "submit">
</form>
# accounts/views.py
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login


# Create your views here.
def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/login.html', context)

login(request, user)

  • AuthenticationForm을 통해 인증된 사용자를 로그인 하는 함수

get_user()

  • AuthenticationForm의 인스턴스 메서드
  • 유효성 검사를 통과했을 경우 로그인 한 사용자 객체를 반환

Logout

  • Session을 Delete하는 과정

logout(request)

  • 현재 요청에 대한 Session Data를 DB에서 삭제
  • 클라이언트의 쿠키에서도 Session Id를 삭제
# accounts/urls.py
app_name = 'accounts'
urlpatterns = [
    path('logout/', views.logout, name='logout'),
]
<h1>Articles</h1>
<a href = "{% url 'accounts:login %}">Login </a>
<form action="{% url 'accounts:update' %}" method = "POST">
    {% csrf_token %}
    {{form.as_p}}
    <input type = "submit" value="Logout">
</form>
# accounts/views.py
from django.contrib.auth import logout as auth_logout
from django.contrib.auth.forms import AuthenticationForm

def logout(request):
    auth_logout(request)
    return redirect('articles:index')

Template with Authenication data

  • 템플릿에서 인증 관련 데이터를 출력하는 방법
profile
데이터 분석에서 백엔드까지...

0개의 댓글