- 그리디
- 이진트리
- N:1
- distinct
- create
- Queue
- Vue
- SQL
- 통계학
- 트리
- migrations
- count
- outer join
- drf
- 백트래킹
- delete
- ORM
- Tree
- DB
- Django
- M:N
- 큐
- 뷰
- 쟝고
- update
- 스택
- stack
- Article & User
- regexp
- 완전검색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
데이터 분석 기술 블로그
Django에 대하여(17)_HTTP request methods와 redirect 본문
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')
...
1-5. HTTP response status code
HTTP response status code는 특정 HTTP 요청이 성공적으로 완료되었는지를 3자리 숫자로 표현하기로 약속한 것입니다.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
1-6. 403 Forbidden
Forbidden이란, 서버에 요청이 전달되었지만 권한 때문에 거절되었다는 것을 의미합니다.
1-7. CSRF(Cross-Site-Request-Forgery)
CSRF란 "사이트 간 요청 위조"로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 하거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법입니다.
- DTL의 csrf_token 태그를 사용해 자용자에게 토큰 값을 부여
- 요청 시 토큰 값도 함께 서버로 전송될 수 있도록 합니다.
요청 시 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 구성
'백엔드' 카테고리의 다른 글
Django에 대하여(18)_Media files (0) | 2024.04.09 |
---|---|
Django에 대하여(17)_Static files (0) | 2024.04.08 |
Django에 대하여(16)_ORM with view(Delete와 Update) (0) | 2024.04.06 |
Django에 대하여(15)_ORM with view(Create) (0) | 2024.04.05 |
Django에 대하여(14)_ORM with view(Read) (0) | 2024.04.04 |