데이터 분석 기술 블로그

Django에 대하여(17)_HTTP request methods와 redirect 본문

백엔드

Django에 대하여(17)_HTTP request methods와 redirect

데이터분석가 이채은 2024. 4. 7. 09:00

1. HTTP request methods

1-1. HTTP

HTTP란, 네트워크 상에서 데이터를 주고받기 위한 약속입니다.

 

1-2. HTTP request methods

HTTP request methods는 데이터(리소스)에 어떤 요청(행동)을 원하는지 나타내는 것으로 GET & POST입니다.

 

1-3. 'GET' Method

'GET' Method는 특정 리소스를 조회하는 요청으로 GET으로 데이터를 전달하면 Query String 형식으로 보내집니다.

 

1-4. 'POST' Method

'POST' Method는 특정 리소스에 변경(생성, 수정, 삭제)을 요구하는 요청으로 POST로 데이터를 전달하면 HTTP Body에 담겨 보내집니다.

<!-- template/articles/new.html -->

<h1>NEW</h1>
<form action="{% url 'articles:create' %}" method="POST">
  <div>
    <label for="title">Title: </label>
    <input type="text" name="title" id="title>
  </div>
    <label for "content">Content: </label>
    <textarea name="content" id="content"></textarea>
  </div>
  <input type="submit">
</form>
<hr>
<a href="{% url 'articles:index' %}">[back]</a>
# articles/views.py

def create(request):
    title = request.GET.get('title')
    content = request.GET.get('content')
    ...

게시글 작성 후 403 응답 확인

 

1-5. HTTP response status code

HTTP response status code는 특정 HTTP 요청이 성공적으로 완료되었는지를 3자리 숫자로 표현하기로 약속한 것입니다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

 

HTTP response status codes - HTTP | MDN

HTTP response status codes indicate whether a specific HTTP request has been successfully completed. Responses are grouped in five classes:

developer.mozilla.org

 

1-6. 403 Forbidden

Forbidden이란, 서버에 요청이 전달되었지만 권한 때문에 거절되었다는 것을 의미합니다.

거절 된 이유: "CRSF toekn이 누락되었다"

 

1-7. CSRF(Cross-Site-Request-Forgery)

CSRF란 "사이트 간 요청 위조"로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 하거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법입니다.

  • DTL의 csrf_token 태그를 사용해 자용자에게 토큰 값을 부여
  • 요청 시 토큰 값도 함께 서버로 전송될 수 있도록 합니다.

CSRF Toekn 적용

 

요청 시 CSRF Toekn을 함께 보내야 하는 이유

  • Django 서버는 해당 요청이 DB에 데이터를 하나 생성하는 (DB에 영향을 주는) 요청에 대해 "Django가 직접 제공한 페이지에서 데이터를 작성하고 있는 것 인지"에 대한 확인 수단이 필요한 것입니다.
  • 겉모습이 똑같은 위조 사이트나 정상적이지 않은 요청에 대한 방어 수단
  • 기존 - 요청 데이터 → 게시글 작성
  • 변경 - 요청 데이터 + 인증 토큰 → 게시글 작성

 

POST일 때만 Token을 확인하는 이유

  • POST는 단순 조회를 위한 GET과 달리 특정 리소스에 변경(생성, 수정, 삭제)을 요구하는 의미와 기술적인 부분을 가지고 있기 때문입니다.
  • DB에 조작을 가하는 요청은 반드시 인증 수단이 필요
  • 데이터베이스에 대한 변경사항을 만드는 요청이기 때문에 토큰을 사용해 최소한의 신원 확인을 하는 것입니다.

 

게시글 작성 결과

  • 게시글 생성 후 개발자 도구를 사용해 Form Data가 전송되는 것을 확인합니다. 
  • 더 이상 URL에 데이터가 표기되지 않습니다.

2. redirect

redirect란, 게시글을 "조회해 줘!"라는 요청이 아닌 "작성해 줘!"라는 요청이기 때문에 게시글 저장 후 페이지를 응답하는 것은 POST 요청에 대한 적절한 응답이 아닙니다.

게시글 작성 후 완료를 알리는 페이지를 응답하는 것

 

데이터 저장 후 페이지를 주는 것이 아닌 다른 페이지로 사용자를 보내야 합니다. 즉 사용자를 보낸다는 사용자가 GET 요청을 한번 더 보내도록 해야 한다는 것입니다.

 

2-1 redirect()

redirect() 함수는 클라이언트가 인자에 작성된 주소로 다시 요청을 보내도록 합니다.

from django.shortcuts import render, redirect

def create(request):
    title = request.POST.get('title')
    content = request.POST.get('content')
    article = Article(titlte=title, content=content)
    article.save()
    
    return redirect('articles:detail', article.pk)
  • 해당 redirect에서 클라이언트는 detail url로 요청을 다시 보내게 됩니다.
  • 결과적으로 detail view 함수가 호출되어 deatil view 함수의 반환 결과인 detail 페이지를 응답받습니다.
  • 결국 사용자는 게시글 작성 후 작성된 게시글의 detail 페이지로 이동하는 것으로 느끼게 됩니다.

 

게시글 작성 결과

  • 게시글 작성 후 생성 된 게시글의 detail 페이지로 redirect 되었는지 확인
  • create 요청 이후에 detail로 다시 요청을 보냈다는 것을 알 수 있습니다.

참고

1. HTTP request methods를 활용한 효율적인 URL 구성

HTTP request methods 사용 예시: TMDB API

 

동일한 URL이지만 method에 따랄 서버에 요구하는 행동을 다르게 요구