학습 정리 - ModelForm, 로그인 (2025.04.01)

수아·2025년 4월 1일
0

학습 정리

목록 보기
44/51
post-thumbnail

회고 리스트

1. 장고 ModelForm 객체에 대하여 설명하시오.

Django에서 ModelForm은 데이터베이스 모델을 기반으로 한 폼을 자동으로 생성해주는 클래스이다.

ModelForm의 특징

  • 모델 필드와 폼 필드를 자동 매핑해서 모델에 정의된 필드들을 그대로 폼 필드로 만들어줌
  • DB와 연동된 데이터를 처리하여 데이터 유효성 검사와 저장이 간단하고 save( ) 메서드를 사용해서 폼 데이터를 쉽게 데이터베이스에 저장할 수 있음
  • 유효성 검사와 폼 검증이 자동으로 처리되어 모델 필드의 제약 조건에 따라 폼 필드의 유효성 검사도 자동으로 적용

ModelForm 사용구조

  • 모델을 정의해서 어떤 필드가 들어갈 지 정함
  • forms.ModelForm을 상속받고 Meta 클래스에서 어떤 모델과 필드를 사용할지 지정하여 ModelForm 클래스를 작성
  • Meta 클래스는 모델과 필드를 지정할 뿐만 아니라 위젯 설정이나 필드 순서 지정 등에도 활용 가능
  • views.py에서 폼을 생성하고 POST 요청을 통해 데이터를 처리

주요 메서드

  • is_valid( ) : 폼 데이터가 유효한지 검사
  • save( ) : 유효성 검사를 통과한 데이터를 모델 인스턴스로 저장
  • cleaned_data : 유효성 검사를 통과한 데이터 사전

장점

  • 모델 필드를 기반으로 자동으로 폼을 생성해서 중복 코드 최소화
  • 모델 필드의 속성에 따라 폼 필드의 유효성 검사 자동 적용
  • 필요 시 폼 필드나 유효성 검사를 추가하거나 수정 가능

2. 장고 로그인 관련하여 세션 쿠키 방식에 대하여 설명하시오.

Django에서 로그인 처리는 세션(session)과 쿠키(cookie)를 활용하여 이루어진다.
로그인한 사용자의 정보를 안전하게 관리하기 위해 세션과 쿠키를 적절히 활용하는 방식이다.

세션 (Session)

세션은 서버에 사용자 정보를 저장하고 클라이언트에게는 세션 ID만 전달하는 방식이다.

  • 서버에 사용자의 로그인 상태를 유지하기 위한 데이터를 저장
  • 클라이언트는 서버로부터 받은 세션 ID를 쿠키에 저장하고 이후 요청 시마다 이를 전송하여 인증
  • 로그인 요청 ➡️ 세션 생성 ➡️ 세션 ID 발급 ➡️ 쿠키에 세션 ID 저장 ➡️ 로그인 성공 ➡️ 요청 시 세션 확인
# 세션 관리 설정 예시
SESSION_COOKIE_AGE = 1800  # 30분 동안 세션 유지
SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 브라우저 종료 시 세션 삭제
SESSION_COOKIE_SECURE = True  # HTTPS 사용 시에만 쿠키 전송

쿠키는 클라이언트 측에 직접 사용자 정보를 저장하는 방식이다.

  • Django에서는 세션 ID만을 쿠키에 저장하여 서버에서는 세션 데이터를 관리
  • 직접 사용자 정보를 쿠키에 저장하는 것은 보안상 매우 위험하므로 권장하지 않음

Django의 로그인 세션 관리

로그인 ➡️ 세션 생성 ➡️ 세션 ID(sessionid)를 쿠키로 전송 ➡️ 이후 요청마다 쿠키의 세션 ID를 사용하여 로그인 상태 확인

Django는 세션 ID를 쿠키로 전달하고 서버 측에서 세션 데이터를 관리하여 보안을 강화한다.


3. login( ) 함수와 authenticate( ) 함수에 대하여 설명하시오.

Django에서 사용자 인증과 로그인을 처리할 때 주로 사용하는 두 가지 함수이다.

authenticate( )

  • 사용자가 입력한 자격 증명이 유효한 지를 확인하는 함수
  • 주어진 아이디(username)와 비밀번호(password)를 사용하여 사용자를 인증
  • 성공 ➡️ 사용자가 존재하고 비밀번호가 맞으면 해당 User 객체를 반환
  • 실패 ➡️ 인증에 실패하면 None을 반환
  • 비밀번호를 암호화하여 비교하기 때문에 DB에 평문 비밀번호를 직접 저장하지 않고 암호화된 형태로 저장해야 함
from django.contrib.auth import authenticate

user = authenticate(request, username="john", password="mypassword")
if user is not None:
    print("인증 성공!")
else:
    print("인증 실패!")

login( )

  • 인증된 사용자를 세션에 저장하여 로그인 상태로 만드는 함수
  • 인증된 User 객체를 세션에 저장하여 로그인 상태로 만듦
  • 로그인 상태를 관리하는데 필요한 세션 데이터를 생성
  • request객체와 User 객체를 parameter로 받음
  • 반드시 authenticate( )를 통해 User 객체를 얻은 후 사용해야 함
  • login( ) 함수 자체로 인증을 수행하진 않음
  • 로그인 성공 시 세션 ID가 쿠키에 저장되어 이후 요청에서도 로그인 상태를 유지
from django.contrib.auth import authenticate, login
from django.shortcuts import redirect

def login_user(request):
    username = request.POST.get("username")
    password = request.POST.get("password")
    user = authenticate(request, username=username, password=password)

    if user is not None:
        login(request, user)  # 세션에 사용자 정보 저장
        print("로그인 성공!")
        return redirect("home")
    else:
        print("로그인 실패!")
        return redirect("login")

두 가지 함수를 같이 사용해야 하는 이유

  • authenticate( ) : 사용자가 입력한 아이디와 비밀번호가 맞는 지 검증하는 단계
  • login( ) : 검증이 완료된 후 세션을 만들어 사용자를 로그인 상태로 유지

authenticate( )를 사용하지 않고 login( )만 사용하면 인증 절차가 없으므로 비정상적인 로그인이 발생할 수 있고
authenticate( )만 사용하면 세션이 생성되지 않아 로그인 상태가 유지되지 않는다.
이 두 함수를 함께 사용하여 로그인 과정이 올바르게 작동하도록 구성해야 한다.

0개의 댓글