본문 바로가기
Django 탐험기

[Django] Form : Http method - GET, POST란???

by 코딩균 2021. 1. 12.

html에서 form 태그를 보면 method 라고 적힌 부분이 있다

<form action="{% url 'user:longin' %}" method="post">
    아이디 : <input type="text" name="id"><br>
    비밀번호 : <input type="password" name="pw"><br>
    <input type="submit">
</form>

도대체 post와 get은 무엇이고 django에서 어떻게 쓰이는 것인가

django form에서의 GET 과 POST에 대해서 정리해보았다

 

* 코딩균의 개발 공부를 뇌에 정리하기 위한 포스팅이며 틀린 점이 있다면 거칠게 댓글에 피드백 부탁드립니다

 

POST

유져는 html의 form 안의 input 내용을 입력한다!

 

입력을 받고 form 안의 buttom 이나 submit type의 버튼을 누르면 

 

브라우저는 form안의 action의 url로 POST 방식을 통해 정보를 보내준다

        브라우저는 정보들을 묶어서 전송을 위해 인코딩 하고 서버에 번들을 보내준다.

 

> 사용 목적

 

데이터 베이스에 있는 정보를 바꿀 일이 필요할 때!

 

사용자의 입력이 데이터 베이스에 저장되어야 하거나 영향을 주어야 하는 경우

      ex) 회원들 등록한다거나, 게시글을 올린다거나 

 

 

GET

POST가 데이터들을 묶어서 인코딩 했다면

 

GET은 제출된 데이터들을 string으로 바꾸어주고 url 의 구성요소로 사용한다.

       인코딩을 해서 서버로 보내는 것이 아니라 string으로 변환해서 url에 넣는다는 것이다!

       ex) https://kiyun.tistory.com/search/?q=나야데이터=1 

 

전송되어야 할 url의 뒤쪽의 ?q=에 GET의 값들이 붙어서 룰루랄라 대놓고 서버로 이동하는 그런 느낌이다.

 

url에 내 요청 내용이 붙어서 서버에 전달되어서 서버가 그것을 알아듣고 브라우저에 정보를 넘겨준다?

 

그 뜻은 결국 누구나 이 url을 복사해서 내 요청 내용을 확인 가능하다는 것이다!!!

 

> 사용 목적

 

POST와는 다르게 시스템의 상태에 영향 미치지 않는 요청인 경우!

       ex) 검새을 한다거나, 현재 페이지와 연관있는 다른 페이지로 이동하기위해 서버에 눈치를 준다거나 

 

POST는 비밀리에 서버에 무엇인가를 넣는다면 GET은 url에 대놓고 외치면서 서버에 가벼운 무엇인가를 요청하는 것이다

 

 

회원가입 로그인 같은 것은 POST?

계속 이야기고 있듯이, GET은 url에 내 요청사항을 다 띄운다!

여담이지만 추후 장고에서 request.GET.get("page") 이렇게 url에 띄워놓은 string 형태를 가져올 수 있다

 

GET으로 비밀번호를 전달한다??? url에 내 비밀번호를 그대로 쓰는 것과 다름 없다!

 

그렇다면 POST 방식을 이용하여 번들로 묶어서 전달하면 될까??

되지만 보안의 문제가 생긴다!

 

백엔드 즉 장고에서 비밀번호를 받고 인증 오케이를 하면 

 

웹사이트 서버는 내 웹 브라우저에게 쿠키(🍪 Cookies)를 준다

 

쿠키(🍪)

key, value 형태로 string문

4KB이상 저장 불가

 

내가 웹사이트에 접속할 때마다 자동적으로 쿠키(🍪 Cookies)를 서버에 보낸다

       ex) 내가 어느 웹사이트에 있다가 브라우저를 종료하고 다시 접속해도 로그인 상태가 유지된다

 

서버를 대신해서 웹 브라우저에 정보를 저장하고 요청을 할 때 그 정보를 보내서 

 

사용자가 우리 서버에 있는 사람인지 확인한다!

 

만약 어떤 쓰렉이 쉐키가 본인이 제작한 불법 사이트에서 내 쿠키를 훔쳐서 

 

웹페이지의 서버로 보낸다면 손쉽게 내 개인정보를 알아낼 수 있을 것이다!

 

그런일을 장고는 두고 보지 않는다 그래야지암.. 

 

CSRF 토큰

장고는 CSRF 토큰을 통해 그러한 쿠키 강탈? 사건을 알아챈다

<form action="{% url 'user:longin' %}" method="post">

	{% csrf_token %}
    
    아이디 : <input type="text" name="id"><br>
    비밀번호 : <input type="password" name="pw"><br>
    <input type="submit">
</form>

{% csrf token %} 이것을 html form 안에 반드시 넣어주어야 한다!

 

안 넣으면 알아서 오류를 띄워보는 친절함도 선사한다

 

그만큼 보안에 있어서 중요하기 때문이다

 

csrf token은 value ="djlfajkjfdahbfkhakhfksdf" 이러한 서버 고유 토큰 값을 form에 심어넣어준다

 

따라서 만약 다른 불법 사이트에서 내 쿠키를 훔쳐가지고

 

form을 통해서 웹사이트 서버로 이렇게 보낸다면 

 

저 토큰 값이 일치하지 않기 때문에 가짜 POST request임을 서버가 알아챌 수 있다 

 

 

장고를 하다보면 너무 다 먹여주는 그런 느낌이 있어서

계속 안 쪽이 어떠한 원리로 돌아가는지 봐야겠다...