웹 보안의 핵심: 쿠키, 세션, 해시 그리고 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에서 쿠키를 설정하려면
- 비유: 쿠키는 웹사이트가 사용자에게 주는 '메모장'과 같습니다. 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에서 세션을 사용하려면
- 비유: 세션은 놀이공원의 '자유이용권'과 같습니다. Django는 사용자에게 자유이용권(세션 ID)을 발급하고, 사용자는 이 자유이용권을 가지고 다양한 서비스에 접근할 수 있습니다.
3. 쿠키와 세션의 비교
| 특징 | 쿠키 | 세션 |
|---|---|---|
| 저장 위치 | 클라이언트 (브라우저) | 서버 |
| 데이터 크기 | 제한적 (약 4KB) | 서버 자원에 따라 유연하게 사용 가능 |
| 보안 | 상대적으로 취약함 | 상대적으로 안전함 |
| 주요 사용 목적 | 사용자 설정, 간단한 정보 저장 | 로그인 유지, 사용자 정보 관리 |
| 생명 주기 | 만료 시간 설정 가능 (세션/영구 쿠키) | 세션 만료 시간 설정, 브라우저 종료 시 자동 만료 |
4. 해시 (Hash): '지문'
- 정의: 해시는 임의의 길이의 데이터를 고정된 길이의 데이터(해시 값)로 변환하는 함수 또는 알고리즘입니다.
- 역할:
- 비밀번호 저장: Django는 사용자 비밀번호를 해시 값으로 변환하여 데이터베이스에 저장합니다.
set_password()메서드를 사용하여 자동으로 해시합니다. - 데이터 무결성 검증: Django는 데이터 전송 시 데이터의 무결성을 검증하기 위해 해시 값을 사용할 수 있습니다.
- 데이터 식별: 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는
- 비유: 해시는 데이터의 '지문'과 같습니다. 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 인증을 간단하게 구현할 수 있습니다.
- Django에서 JWT를 사용하려면
- 비유: 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 |