기술블로그-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을 사용한 쿠키 서명, 메시지 인증도 예제로 확장할 수 있어요! 🔐