본문 바로가기
Python/Django

웹보안을 위해 쿠키, 세션, 해시 그리고 JWT (Django 관점)

by 좌우지간에 2025. 1. 17.

 

 

웹 보안의 핵심: 쿠키, 세션, 해시 그리고 JWT (Django 관점)

웹 애플리케이션에서 사용자 인증과 권한 부여, 그리고 사용자 경험을 관리하는 것은 매우 중요한 문제입니다. 이러한 문제를 해결하기 위해 쿠키, 세션, 해시, JWT와 같은 다양한 기술들이 사용됩니다. 이 글에서는 이러한 기술들이 무엇이고, 어떻게 작동하는지, 그리고 Django 프레임워크에서 어떻게 사용되는지 자세히 알아보겠습니다.

 

1. 쿠키 (Cookie): '메모장'

  • 정의: 쿠키는 웹사이트가 사용자의 웹 브라우저에 저장하는 작은 텍스트 파일입니다.
  • 역할:
    • 사용자 식별: Django는 쿠키를 사용하여 사용자를 식별할 수 있습니다. (예: 세션 ID 저장)
    • 상태 유지: Django는 사용자 설정, 테마 선택, 장바구니 정보 등을 쿠키에 저장하여 상태를 유지할 수 있습니다.
    • 데이터 저장: Django는 클라이언트 측에 데이터를 저장하여 서버 부하를 줄일 수 있습니다.
  • 특징:
    • 클라이언트 (브라우저)에 저장됩니다.
    • 만료 시간 설정이 가능합니다 (세션 쿠키, 영구 쿠키).
    • 보안에 취약할 수 있으므로 중요한 정보는 저장하지 않아야 합니다.
  • Django 활용:
    • Django에서 쿠키를 설정하려면 HttpResponse 객체의 set_cookie() 메서드를 사용합니다.
      response = HttpResponse("Hello, world!")
      response.set_cookie('my_cookie', 'cookie_value', max_age=3600) # max_age 초 뒤 만료
    • 쿠키 값을 읽으려면 request.COOKIES 딕셔너리를 사용합니다.
      def my_view(request):
          my_cookie = request.COOKIES.get('my_cookie')
  • 비유: 쿠키는 웹사이트가 사용자에게 주는 '메모장'과 같습니다. Django는 이 메모장에 사용자의 정보를 적어두고, 다음에 사용자가 방문할 때 이 메모장을 보고 사용자를 기억합니다.

 

 

2. 세션 (Session): '자유이용권'

  • 정의: 세션은 서버가 사용자별로 유지하는 상태 정보입니다.
  • 역할:
    • 사용자 식별: Django는 세션을 사용하여 사용자를 식별하고 로그인 상태를 관리합니다.
    • 상태 유지: Django는 로그인 상태, 사용자 프로필 정보, 장바구니 데이터 등을 세션에 안전하게 저장합니다.
    • 보안 강화: 민감한 사용자 정보는 세션에 저장하여 보안을 강화합니다.
  • 특징:
    • 서버에 저장됩니다.
    • 세션 ID는 쿠키를 통해 클라이언트에 전달되지만, 실제 사용자 정보는 서버에 저장됩니다.
    • 보안성이 높습니다.
  • Django 활용:
    • Django에서 세션을 사용하려면 request.session 객체를 이용합니다.
      request.session['user_id'] = 123 # 세션에 데이터 저장
      user_id = request.session.get('user_id') # 세션에서 데이터 읽기
      del request.session['user_id'] # 세션에서 데이터 삭제
    • Django는 세션 ID를 쿠키에 저장하여 클라이언트와 서버 간에 세션을 관리합니다.
  • 비유: 세션은 놀이공원의 '자유이용권'과 같습니다. Django는 사용자에게 자유이용권(세션 ID)을 발급하고, 사용자는 이 자유이용권을 가지고 다양한 서비스에 접근할 수 있습니다.

 

 

3. 쿠키와 세션의 비교

특징 쿠키 세션
저장 위치 클라이언트 (브라우저) 서버
데이터 크기 제한적 (약 4KB) 서버 자원에 따라 유연하게 사용 가능
보안 상대적으로 취약함 상대적으로 안전함
주요 사용 목적 사용자 설정, 간단한 정보 저장 로그인 유지, 사용자 정보 관리
생명 주기 만료 시간 설정 가능 (세션/영구 쿠키) 세션 만료 시간 설정, 브라우저 종료 시 자동 만료

 

 

4. 해시 (Hash): '지문'

  • 정의: 해시는 임의의 길이의 데이터를 고정된 길이의 데이터(해시 값)로 변환하는 함수 또는 알고리즘입니다.
  • 역할:
    • 비밀번호 저장: Django는 사용자 비밀번호를 해시 값으로 변환하여 데이터베이스에 저장합니다. set_password() 메서드를 사용하여 자동으로 해시합니다.
    • 데이터 무결성 검증: Django는 데이터 전송 시 데이터의 무결성을 검증하기 위해 해시 값을 사용할 수 있습니다.
    • 데이터 식별: Django는 고유한 해시 값을 생성하여 데이터를 식별할 수 있습니다.
  • 특징:
    • 단방향성: 해시 값으로 원본 데이터를 복원할 수 없습니다.
    • 고유성: 원본 데이터가 조금이라도 변경되면 해시 값은 완전히 달라집니다.
    • 고정 길이: 입력 데이터의 길이와 상관없이 항상 고정된 길이의 해시 값을 생성합니다.
  • Django 활용:
    • Django는 set_password() 메서드를 사용하여 비밀번호를 해시하고, check_password() 메서드를 사용하여 해시된 비밀번호를 비교합니다.
    • Django는 기본적으로 PBKDF2 알고리즘을 사용하며, settings.py 파일에서 다른 해시 알고리즘을 설정할 수 있습니다.
      # settings.py
      PASSWORD_HASHERS = [
          'django.contrib.auth.hashers.PBKDF2PasswordHasher',
          'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
          'django.contrib.auth.hashers.Argon2PasswordHasher',
          'django.contrib.auth.hashers.SCryptPasswordHasher',
      ]
  • 비유: 해시는 데이터의 '지문'과 같습니다. Django는 해시를 사용하여 비밀번호를 안전하게 저장하고, 데이터가 변조되었는지 검증합니다.
  • 솔트(Salt): Django는 비밀번호 해시 시 솔트를 자동으로 적용합니다. 사용자가 직접 솔트를 관리할 필요는 없지만, 솔트가 해시의 보안성을 강화한다는 점을 알아두는 것이 좋습니다.

 

 

5. JWT (JSON Web Token): '통행증'

  • 정의: JWT는 JSON 형식으로 인코딩된 토큰으로, 클라이언트와 서버 간에 정보를 안전하게 교환하기 위해 사용됩니다.
  • 역할:
    • 사용자 인증: Django는 JWT를 사용하여 사용자를 식별하고 로그인 상태를 유지할 수 있습니다.
    • 권한 부여: Django는 JWT를 사용하여 특정 API 엔드포인트에 대한 접근 권한을 부여할 수 있습니다.
  • 특징:
    • 무상태(Stateless): 토큰 자체에 필요한 정보가 포함되어 있어서 서버에 저장할 필요가 없습니다.
    • 보안성: 서명을 통해 토큰의 위조 및 변조를 방지할 수 있습니다.
    • 확장성: 다양한 플랫폼에서 사용 가능합니다.
  • Django 활용:
    • Django에서 JWT를 사용하려면 django-rest-framework-simplejwt와 같은 라이브러리를 사용할 수 있습니다.
    • Django REST framework와 함께 JWT를 사용하면 API 인증을 간단하게 구현할 수 있습니다.
  • 비유: JWT는 클라이언트와 서버 간의 '통행증'과 같습니다. Django는 JWT를 발급하고, 클라이언트는 이 JWT를 가지고 서버에 요청을 보낼 수 있습니다.

 

 

, 세션, 해시, JWT의 관계 (Django 관점)

  • 쿠키와 세션: Django는 쿠키를 사용하여 세션 ID를 저장하고, 세션을 유지합니다. 세션 데이터는 서버에 저장되어 있으며, 사용자를 식별하고 상태를 유지하는 데 사용됩니다.
  • 해시와 세션: Django에서 세션 ID를 생성할 때 해시 함수가 사용될 수 있습니다. 또한 Django는 set_password() 메서드를 사용하여 비밀번호를 해시하여 저장합니다.
  • 해시와 솔트: Django는 비밀번호 해시 시 솔트를 자동으로 사용합니다. PASSWORD_HASHERS 설정을 통해 해시 알고리즘과 함께 솔트 사용을 변경할 수 있습니다.
  • JWT와 세션: Django는 JWT를 사용하여 사용자 인증을 구현할 수 있습니다. JWT는 서버에 상태를 저장하지 않고 토큰 자체로 인증을 처리할 수 있다는 장점이 있습니다.

 

 

결론

쿠키, 세션, 해시, JWT는 Django 프레임워크에서 웹 보안을 구현하는 데 사용되는 핵심 기술들입니다. Django는 이러한 기술들을 편리하게 사용할 수 있도록 다양한 기능을 제공하고 있으며, 개발자는 이러한 기능들을 이해하고 적절하게 사용하여 안전하고 효율적인 웹 애플리케이션을 개발해야 합니다.

'Python > Django' 카테고리의 다른 글

DRF(Serializer)  (1) 2025.01.21
Django 에서 commit  (0) 2025.01.20
DRF학습전 API, RESTful API 미리보기  (1) 2025.01.16
Django form활용 유효성검사  (1) 2025.01.14
Django 객체 추상화(모델 클래스 상속)  (1) 2025.01.13