서버에 요청을 하면서 당연스럽게 POST, GET을 겸해서 사용해왔습니다
제가 아는 GET 과 POST의 개념은 GET은 가져온다는 개념, POST는 수행하는 개념 정도로만 알고 있었죠
좀더 세세하게 알아보기 위해 찾아보고 포스팅 하려합니다
일단 왜 사용하는 지에대해 정리를 하려고 합니다.
"GET, POST 방식의 request는 서버로 본인이 가지고 있는 data를 전달하기 위해서 사용합니다."
Data를 전달한다라는 본질적인 기능측면에선 똑같다고 볼 수 있습니다.
그런데 세부적으로 보안,전달형식,전달 할 수 있는 data의 량적인 측면에서 봤을때 차이점이 발생합니다.
GET과 POST 방식이 가지고 있는 특징을 살펴 봅시다
#GET 방식
-클라이언트로 입력한 query의 이름과 값이 결합되어 스트링 형태로 서버에 전달 됩니다.
-<FORM> TAG의 method속성의 값으로 get을 입력합니다.
ex)<FORM NAME = " form1" ACTION="index.jsp" METHOD="GET">
-한번 요청시 전송 데이터 양은 주소값+파라미터로 255자(HTTP/1.1인 경우 2048자)로 제한됩니다.
-DB에 추가로 정보를 처리하지 않고, 저장된 Data를 단순 요청하는 정도로 사용합니다.
-Dependancy:Post<Get
-URL에 그대로 query의 이름과 값이 같이 연결 되어 표현됩니다.
ex) http://www.naver.com/news?title=뽀각
#GET방식 예제 - test.html
<HTML>
<HEAD>
<TITLE>GET방식 예제</TITLE>
</HEAD>
<BODY>
<CENTER>
<FORM NAME="form1" ACTION="test.asp" METHOD="get">
이름:<input type="text" name="uname">
메일:<input type="text" name="mail">
<p></p>
<input type="submit" value="전송">
<input type="reset" value="다시">
</form>
</center>
</body>
</html>
#GET방식에 보여지는 URL
http://localhost/test.jsp?uname=뽀각&mail=test@hanmail.net
#POST 방식
-클라이언트와 서버간에 인코딩하여 서버로 전송합니다.
-헤더를 통해 요청이 전송되는 방식입니다.
-<FORM> TAG의 method속성의 값으로 post를 입력합니다.
ex)<FORM NAME = "form1" ACTION="index.jsp" METHOD="POST">
-한번 요청시 데이터 양은 제한이 없습니다.
-Dependancy:POST>GET
-{PST 방식 : 클라이언트에서 데이터를 인코딩-> 서버측에서 디코딩 해서 사용합니다.
-Query는 body안에 들어가 있어서 보안에 조금 유리함이 있습니다.
#post방식 예제 - text.htm
<html>
<head>
<titlem>post방식 예제</title>
</head>
<body>
<center>
<form name = "form1" action="test.asp" method="post"
이름 : <input type="text" name="uname">
메일 : <input type="text" name="mail">
<br>
<input type="submit" value="전송">
<input type="reset value="다시">
</form>
</center>
</body>
</html>
#POST 방식에 보여지는 URL
http://localhost/test.asp
다음은 참고할만한 asp에서 어떤 method를 사용해서 uname, mail을 전달하는 방법을 참고 할 수 있습니다.
# test.asp 파일
<%@ LANGUAGE = VBScript%>
<html>
<head>
<title>TEST</title>
</head>
<body>
<center>
<h1>다음의 정보를 입력 하였습니다</h1>
//GET방식 //POST방식
이 름 = <b><%=Request.QueryString("uname")%></b> : 이 름 = <b><%=Request.Form("uname")%></b>
//GET방식 //POST방식
메 일 = <b><%=Request.QueryString("mail")%></b> : 메 일 = <b><%=Request.Form("mail")%></b>
</center>
</body>
</html>
#POST 방식이 나온 이유
-GET방식으로 넘길 수 있는 데이터의 양은 한계가 있기 때문이 있고,
-사용자들에게 쉽게 URL path와 query를 노출되지 않게 body에 넣어서 노출되지 않게 하기 위해서 입니다.
(다만 GET,POST 둘 다 보안은 취약합니다!. POST가 보안에 더 강하다는 말은..잘못알고있었네요 전 )
#그리고 여기서 주목해야하는 부분은 어디에 GET과 POST를 사용하는가?
GET은 가져온다는 개념이고, POST는 수행한다는 개념으로 받아들이면 됩니다.
조금 더 자세히 사용하는 차이점에 대해서 이야기를 하자면
GET은 select와 비슷한 성향을 가지고 있습니다.
서버에서 어떤 데이터를 가져와서 보여줄 때 사용합니다.
즉, 서버의 어떤값이나 내용, 상태등을 바꾸지않는 경우에 사용합니다.
예를 들면, 게시판에서 글의 내용에 대한 목록을 보여주는 경우나 글의 내용을 보는 경우 입니다.
POST는 서버의 값이나 상태를 바꾸기 위해서 사용합니다.
글쓰기를 하면 글의 내용이 DB에 저장/수정시에 DB의 값이 변경되게하는 경우에 POST를 사용 합니다.
예를 들면, 게시판의 글을 써서 올리거나, 수정하는 경우 입니다.
#GET과 POST를 잘 못 사용 하는 경우에 대해서는 Google"Accelerator" 사건이 있습니다.
Google은 웹페이지를 더 빠른 속도로 제공하기 위해서 현재 웹페이지에 URL로 Link가 쓰여있으면 미리 해당 페이지의 내용을 가져와서,
Link의 내용을 가져옵니다. 그래서 웹페이지를 전환하는 경우 빠르게 전환될 수 있게 합니다.
마치 한 번 방문했던 사이트에 다시 접근할 때 빠르게 기존의 내용을 불러와 빨리 보여주는 것과 같습니다.
그런데 문제는 구글러라는 구글의 개발자들이 GET, POST의 개념이 없이 개발을 시작하면서 발생했습니다.
WEB RESTful API의 CRUD의 지식에서 생각을 해보면,
GET은 Read를 호출하는 경우에 사용을 합니다. 그리고 나머지 Create, Update, Delete는 POST를 이용하는 게 맞습니다.
그런데 마음대로 혼용해서 구글에서 개발을 해서 Delete 같은 곳에도 GET을 이용해서 개발하여,
Accelerator가 웹페이지의 URL을 가져오는 경우 GET으로 당연히 가져오는 것으로 인식하였지만,
중간에 Delete를 GET으로 개발해놓은 부분과 충돌하여 링크의 메일이나 게시글이 마구 지워지는 사태가 발생했습니다.
그러나 GET도 정말 필요한 부분이 있습니다.
URL안에 해당 사이트가 어떻게 구성되었고, 어떤 Query를 담아서 요청하는 지가 보이는 문제로 보안에 위협이 되었습니다.
그런데 그 부분이 또 하나의 장점이 되는 경우가 있습니다. 요새 흔히 사용하는 "카카오톡의 공유하기"와 같은 기능입니다.
공유하기 기능은 URL을 보내줌으로써 공유를 하는 것인데, POST에는 URL에 보안때문에 담고 있지 않아서 공유하기가 힘이 듭니다.
그래서 여기서 GET의 보안적 문제점이지만 링크를 공유할 때 장점이 되는 URL에 모든 내용을 담고 있는 부분 입니다.
마지막 결론은 GET과 POST 둘 다 어떤 부분에 사용을 하는 지 설계하고, 그 다음에 사용을 해야 한다는 것입니다.
그동안 POST와 GET에 대해서 많은 헷갈림이 있었지만 이 글을 작성하면서 확실히 명확해 졌습니다.
참고: https://interconnection.tistory.com/72?category=616434 [라이언 서버]
'차근차근 궁금 뽀각' 카테고리의 다른 글
Cookie vs Session (0) | 2019.12.09 |
---|---|
List와 Map의 차이점 (0) | 2019.12.09 |
jsp와 HTML 비교 (0) | 2019.12.04 |