∟Framework/∟Django

Django - Auth

최 수빈 2025. 2. 4. 19:41

 

Auth

 

인증(Auth)은 웹 개발에서 필수 요소

Django 역시 이를 지원함

 

settings.py의 INSTALLED_APPS

 

'django.contrib.auth' : 인증 관련 핵심 로직, 모델 제공

'django.contrib.contenttypes' : 사용자 모델과 권한을 연결

 

  • 인증 (Authentication) : 사용자가 누구인지 확인하는 과정
  • 권한 (Authorization) : 사용자가 특정 작업을 수행할 수 있는지 확인하는 과정

Auth == 인증(Authentication) + 권한(Authorization)



쿠키(cookie), 세션(session)

 

HTTP와 쿠키/세션의 필요성

 

 

HTTP의 특징

  • 비연결지향(Connectionsless)
    한 번 요청에 대한 응답 후 연결이 종료됨
  • 무상태(Stateless)
    이전 요청을 기억하지 못함

→ 쿠키와 세션이 없다면 로그인 상태가 유지되지 않음

 

 

쿠키(Cookie)

서버가 브라우저에 저장하는 데이터 조각(Key-Value 형태)

 

  • 동일한 서버에 요청할 때마다 자동으로 함께 전송됨
  • 장바구니, 최근 본 상품, 광고 추적 등에 사용
  • 보안 취약점 존재 (로컬에서 변조 가능)

 

쿠키의 수명

 

세션쿠키(Session Cookie)

현재의 세션이 종료되면(브라우저가 닫히면) 삭제됨

 

지속쿠키(Persistent Cookie)

디스크에 저장되며 브라우저를 닫거나 컴퓨터를 재시작해도 남아있음

Max-Age를 지정하여 해당 기간이 지나면 삭제 가능

 


세션(Session)

서버에서 유지되는 사용자 정보 저장 방식

 

  • 로그인 시, 서버가 세션 ID를 발급, 이를 쿠키에 저장
  • 이후 요청 시 세션 ID를 이용해 사용자 확인
  • 민감한 정보를 클라이언트에 저장할 필요 없이 서버에서 검증 가능

 

↓↓↓↓↓

 

 

 

  1. 클라이언트가 서버에 접속
  2. 서버가 특정 session id를 발급
  3. session id 전달받아 쿠키에 저장
  4. 클라이언트는 해당 쿠키를 이용해서 요청
  5. 서버는 쿠키에서 session id를 꺼내어 검증
  6. 검증 성공 시 알맞은 로직 처리

 

 


Django의 Session과 Auth

 

 

 

settings.py의 MIDDLEWARE

 

→ Django가 내부적으로 세션과 인증을 관리하므로 직접 구현 필요 없음


Django의 Authentication System

 

Django에서 인증 시스템 사용

 

로그인, 로그아웃 구현하기

 

 

로그인

Session을 Create하는 로직

 

 

 

'accounts' 앱 생성 및 프로젝트 'urls.py'와 연결

python manage.py startapp accounts

프로젝트 urls.py와 연결

 

'accounts/urls.py' 설정

accounts/urls.py



'accounts/views.py'에서 로그인 기능 구현

accounts/views.py

  1. request.mothod를 확인하여 POST요청이면 로그인 처리를 수행
  2. AuthenticationForm(data=request.POST)를 통해 사용자가 입력한 로그인 정보를 검증
  3. form.is_valid()를 통해 아이디/비밀번호가 올바르면 auth_login(request, form.get_user())를 실행
  4. → Django의 인증 시스템 활용, 실제 로그인 처리
  5. 로그인 성공 시 redirect("articles:index2")
  6. 아니면 accounts/login.html에 머무름

'articles.urls.py'

 

Authentication Form

 

Django의 Built-Form

 

  • 로그인을 위한 기본 form 제공
  • login()함수로 사용자 로그인 처리를 해주고, 내부적으로 session을 사용해서 user정보 저장

 

accounts/templates/accounts/login.html 생성    

accounts/templates/accounts/login.html

 

 

*Django auth_user

Django의 기본 user모델

 

→user정의 필요 없음

 

*user에 대한 더 많은 정보를 필요로 한다면, 기본 user모델을 확장하면 됨

 

 

Django의 superuser

 

Django의 기본 인증 시스템에서 제공하는 사용자 유형 중 하나

모든 데이터와 기능을 제어할 수 있는 계정

최고 권관리자 권한을 가진 사용자를 의미함

 

  • Django Admin 접근 가능
    (/admin)에 로그인 가능
    모든 모델 데이터를 추가, 수정, 삭제할 수 있음
  • 모든 권한 보유 (is_superuser=True)
    Django의 User모델에는 is_superuser라는 필드가 있는데, True로 설정된 사용자는 모든 권한을 가짐
    보통 일반 유저는 특정 그룹에 속하거나 개별 권한을 받아야 함
    ☞superuser는 제한 없이 모든 기능을 사용할 수 있음
  • is_staff=True 속성 포함
    is_staff=True가 설정된 유저만 Django Admin에 접근 가능
    Superuser는 자동으로 is_staff=True
  • 데이터베이스의 모든 데이터를 조회 및 변경 가능
    일반 사용자 : 자신의 계정 정보나 특정 그룹의 정보만 볼 수 있도록 제한할 수 있음
    Superuser : 모든 데이터에 대한 읽기/쓰기/삭제 권한 가짐

 

 

 

superuser 생성 (관리자 계정 등록)

 

python manage.py createsuperuser

 

 

*Superuser 삭제

User.objects.filter(is_superuser=True).delete()

 

 

 



'base.html'에 로그인 링크 추가

templates/base.html
login navbar

 

로그아웃 구현 하기

 

로그아웃

서버의 세션 데이터를 지우는 것

 

  • 현재 request에서 가져온 session을 사용하여 DB에서 삭제
  • 클라이언트 쿠키에서도 삭제

 

'accounts/urls.py' 설정

accounts/urls.py

 

 

'accounts/views.py'에서 로그아웃 기능 구현

accounts/views.py

 

DB를 조작하는 요청이기 때문에 request.method = "POST"

 

 

로그아웃 버튼 추가('base.html')

 

 

HTTP 요청 처리 방법과 접근 제한

 

Django의 HTTP 요청 처리 방법

 

Django Shortcut Functions

 

  • render() : 템플릿을 렌더링하여 응답
  • redirect() : 특정 URL로 이동
  • get_object_or_404() : 객체가 없으면 404 오류
  • get_list_or_404() : 필터링된 객체 리스트가 없으면 404 오류 반환

 

/articles/없는pk/ - get_object_or_404() ver.

get_object_or_404()

 

/articles/없는pk/ - 기존DoesNotExist



Django의 View Decorators

 

  • require_http_methods() : 특정 HTTP 요청만 허용
  • require_POST() : POST 요청만 허용
accounts/views.py

 

Template with Auth

Django 템플릿에서 인증 정보를 활용 가능

 

→ request.user 객체를 사용하여 현재 로그인한 사용자 정보 제공

auth.User 클래스의 인스턴스 또는 AnonymousUser 인스턴스를 반환

 


 

접근 제한 (로그인 필요)

 

  • is_authenticated 속성 사용
    로그인한 사용자만 특정 기능을 사용할 수 있도록 제한 가능
  • @login_required 데코레이터 적용
    로그인한 사용자만 특정 view에 접근할 수 있도록 제한
    로그인되지 않은 경우 `LOGIN_URL`로 리디렉트됨

 

is_authenticated

base.html
accounts/views.py
articles/articles.html

 

 

@login_required

로그인이 되어있지 않은 상태에서 접근하면 settings.LOGIN_URL에 설정된 경로로 이동 (기본값은 /accounts/login)

로그인이 되어있으면 view로직 실행

로그인 성공시 이전 페이지로 자동 이동 → 쿼리스트링에 next로 저장(별도 처리 안해주면 지정한 경로로 이동)

 

 

articles/view.py update, delete모두 적용

 

 


Django의 Auth 활용하면 쉽게 로그인 및 로그아웃 기능을 구현할 수 있음

HTTP의 특징 (Stateless)을 보완하기 위해 쿠키와 세션 활용

Django가 기본적으로 제공하는 기능을 사용하면 보안성을 확보 + 간편한 인증 시스템 구축 가능

@login_required 및 is_authenticated를 활용해 접근 제한 적용 가능