기술블로그-Django편
🔐 Django signing.dumps() 완벽 이해하기
Chansman
2025. 5. 19. 11:32
🔐 Django signing.dumps() 완벽 이해하기
✨ 1. 개념 정리: signing.dumps()란?
signing.dumps()는 Django에서 제공하는 **"데이터 위변조 방지 도구"**입니다.
- 데이터를 base64로 인코딩하고,
- 서버 비밀 키로 서명(Signature)을 붙여
- 누군가 데이터를 조작하지 않았는지 확인할 수 있게 해줍니다.
🔸 단, "암호화"는 아닙니다. 누구나 내용은 볼 수 있지만, 조작은 못 합니다.
🧪 2. 간단한 예시로 보기
from django.core import signing
NAVER_STATE = "naver login"
# ✅ 데이터에 서명 붙이기
signed_state = signing.dumps(NAVER_STATE)
print(signed_state)
# 출력 예시: Im5hdmVyIGxvZ2luIg:1s7FQJ:7eKawNyCt1YxC8UCVCX8S0Rgo4U
# ✅ 나중에 검증하기
original = signing.loads(signed_state)
print(original) # "naver login"
이렇게 생성된 signed_state는 세 부분으로 구성됩니다:
"Im5hdmVyIGxvZ2luIg" : base64 인코딩된 원본
"1s7FQJ" : timestamp (생성 시간)
"7eKawN..." : 서명 (비밀키 기반)
🔍 3. 왜 서명이 필요할까?
❓ 문제 상황: 서명이 없으면?
사용자가 로그인 요청을 보내며 이런 URL을 전송한다고 해보세요:
https://nid.naver.com/oauth2.0/authorize?client_id=...&state=admin_access
만약 이 state 값에 서명이 없다면, 누군가가 다음을 할 수 있습니다:
- state=naver login → state=admin_access로 변조
- redirect_uri를 바꿔서 악성 사이트로 리디렉션
서명이 없으면 서버는 이게 내가 보낸 건지, 누가 조작했는지 알 수 없습니다.
✅ 4. signing의 역할 정리
역할 설명
✅ 무결성 보장 | 데이터가 변하지 않았는지 확인 |
✅ 인증 | 내가 만든 값이 맞는지 확인 |
✅ CSRF 방지 | OAuth 등의 로그인 흐름 보호 |
✅ 보안성 강화 | 쿠키, URL 파라미터, 상태 정보 등 조작 방지 |
🔐 5. signing.dumps() vs 암호화 차이
항목 signing.dumps() 암호화 (encryption)
목적 | 조작 방지 | 내용 숨기기 |
내용 볼 수 있음? | ✅ 예 | ❌ 아니요 |
복호화 가능? | ✅ 원본 복원됨 | ✅ 가능 (비밀키 필요) |
사용 용도 | OAuth state, 쿠키 등 | 비밀번호, 개인정보 등 |
🧠 6. 마무리 요약
- signing.dumps()는 Django에서 데이터에 **"디지털 서명"**을 붙여서 조작을 막는 도구다.
- OAuth 로그인, 쿠키 저장, 보안 민감한 URL 등에서 유용하다.
- 내용은 노출될 수 있지만, 바꾸면 서버에서 거부한다!
💬 실제 예제 응용 (OAuth 로그인)
# 로그인 요청 시
state = signing.dumps("naver login")
oauth_url = f"https://nid.naver.com/oauth2.0/authorize?...&state={state}"
# 콜백 시
received = request.GET.get("state")
try:
decoded = signing.loads(received)
assert decoded == "naver login"
except signing.BadSignature:
raise Exception("위조된 요청입니다.")
필요하다면 signing을 사용한 쿠키 서명, 메시지 인증도 예제로 확장할 수 있어요! 🔐