티스토리 뷰

WEB/WEB HACKING

1-8) GET vs POST

chrisysl 2018. 2. 21. 00:52

GET vs POST


GET : 가져온다 / POST : 수행한다



GET

 - Select와 비슷한 성향

 - 서버에서 어떤 데이터를 가져와서 보여줄 때 사용

 - 즉, 서버의 어떤 값이나 내용, 상태 등을 바꾸지 않는 경우에 사용

 - 예를 들면, 게시판에서 글의 내용에 대한 목록을 보여주는 경우, 글의 내용을 보는 경우

 - 클라이언트로가 입력한 query의 이름과 값이 결합되어 스트링 형태로 서버에 전달

 - <FORM> TAG의 METHOD 속성의 값으로 GET을 입력

 - ex) <FORM NAME="form1" ACTION="index.jsp" METHOD="GET">

 - 한번 요청시 전송 데이터 양은 주소값+파라미터로 255자로 제한

 - DB에 추가로 정보를 처리하지않고, 저장된 Data를 단순 요청하는 정도로 사용

 - URL에 그대로 query의 이름과 값이 연결되어 표현됨

 - ex) http://music.naver.com/listen/top100.nhn?domain=TOTAL



POST

 - 서버의 값이나 상태를 바꾸기 위해서 사용

 - 글쓰기를 하면 글의 내용이 DB에 저장 또는 수정시에 DB의 값이 변경되게하는 경우에 POST를 사용

 - 예를 들면, 게시판의 글을 써서 올리거나, 수정하는 경우입니다.

 - 클라이언트와 서버 간에 인코딩하여 서버로 전송
 - 헤더를 통해 요청이 전송되는 방식
 - <FORM> TAG의 METHOD 속성의 값으로 POST를 입력

 - ex) <FORM NAME="form1" ACTION="index.jsp" METHOD="POST">

 - 한번 요청시 데이터 양은 제한이 없음
 - DB에 추가로 서버에서 갱신 작업을 할 때, 서버에서 정보가 가공되어 응답하는 경우에 사용
 - 클라이언트에서 데이터를 인코딩 -> 서버측에서 디코딩 하여 사용
 - query는 body안에 들어 있어 보안에 약간 더 유리함



데이터 입력이란?

 - 웹브라우저를 통해 입력값을 이 PHP에게 데이터를 전달하겠다는 것.


브라우저를 통해 PHP로 만들어진 어플리케이션 한테 데이터를 주는것을 의미

서버로 전달되는 것이기에 HTTP라는 프로토콜을 통해 데이터를 전달하는 것

서버로 값을 전달하고, 서버가 처리하고, 결과를 받아오는데 이러한 과정들이 HTTP규약에 의거한 통신을 통해 이루어 진다. 



PHP에는 미리 지정된 변수 (super globals) 가 저장되어 있다.

 - 보통 PHP에서 정의된 변수는 해당 PHP파일 안에서만 유효

 - 마찬가지로 함수 안에 있으면 함수 안에서만 유효

 - 마찬가지로 글로벌 변수라 하더라도 파일 안에서만 유효

 - 그러나 미리 만들어진 super globals 는 어디서든 참조가 가능

 - 즉 조금 특별한 변수 라고 생각하면 된다.

 - PHP에서는 설정을 통해서 일반변수도 super globals 로 지정할 수가 있다.



일반 변수를 Super Globals 로 사용하는 방법


#> vi /etc/php.ini → register_globals = off 를 on으로 변경시켜주면 된다. (693번째 줄)

이 기능이 on으로 되면 일반변수를 super globals로 사용 가능하지만, 퍼포먼스 성능이 떨어지게 된다.






$_GET

$_POST
$_COOKIE

$_SESSION

보안과 관련해서는 매우 중요한 기본적인 네가지이다. 우선적으로 살펴보도록 하자.


$_SERVER

$_REMOTE

위의 두개는 사용자인증에 관련된 부분이다.






$_GET : GET 방식으로 보낸 데이터가 담겨있다.

$_POST : POST 방식으로 보낸 데이터가 담겨있다.


# input.php 파일을 만들어서 위와같이 입력 후 접속해보면, 아무것도 나타나지 않는다.

데이터를 아직 안보냈기 때문. print_r 인것을 보면 배열임을 알 수 있다.






GET 방식으로 데이터를 보내는 방법

 - URL을 통하여 데이터를 전달 할 수있다. 즉, 헤더를 통해 데이터를 전달하기 때문에 보내려는 데이터의 크기도 제한적이다.

 - 정보가 쉽게 공개되기 때문에 보안에 취약하다.



# input.php에 데이터를 보내겠다는 것은 '?' 구분자를 사용한다.

변수와 변수를 구분하는 구분자는 '&' 을 사용한다.

이렇게 URL을 통해 데이터를 전달하는 방식이 GET 방식이다.



즉, GET은 HTTP의 헤더를 통해서 데이터를 전달한다고 이해하면 된다.

변수 이름이 '키'가 되고, 변수의 값이 해당 키의 '값'이 된다.



GET이나 POST를 통해 전달되는 변수는 외부에서 전달되는 변수라고 생각하면 된다.

외부에 의해서 변수가 정의된다는 것이다.



다시말해, 위의 GET방식으로 클라이언트 측이 서버측으로 데이터를 전송하게 되면, 외부에서 정의된 값이 된다.

프로그램 안쪽에서 정의된 것이 아니라, 사용자에 의해서 변수가 정의 될 수 있다는것이다. 

이것이 PHP의 특징이다.



따라서 $_GET 배열에 키값으로 들어간다 해도 이것을 변수로 봐도 된다는 것.

그렇기 떄문에 GET방식은 보안에 상당히 취약한 방식중 하나이다.




# 여기서만 확인하더라도 '?' 구분자 뒤로 클라이언트측이 서버측으로 데이터를 전달하는 키와 값을 모두 확인할 수 있다.

oid, aid 라는 변수를 선언해서 값을 할당하고 있음을 확인할 수 있다.






GET방식을 이용한 HTML의 사용

 - 사용자로부터 이름과 나이를 입력받아, 다시 입력된 이름을 화면에 출력하는 간단한 PHP프로그램을 작성해보자.



# 위와같이 아무것도 넘기지 않았을땐 확인이 되지 않는다.






# 키와 값을 넘겨주면 확인이 가능하다. 즉 서버측으로 값이 전달되었다는 것이다.






# 마찬가지로 아무값을 넘기지 않았을땐, else문에 걸리게 되고






# 값을 넘기면 해당 키와 값이 출력된다.


위와같은 방식들이 CGI가 동적인 값을 전달하게 된 최초의 기술이 되었다.






# 자바스크립트로도 동일하게 출력되게 할 수는 있다.

하지만 PHP를 이용한 방식은 사용자는 데이터를 전달하고 서버는 데이터를 받아 

그것에 맞는 데이터를 다시 리턴해주는 방식이다.






# 위와같이 PHP 영역을 나눠 HTML과 혼합하여 사용할 수 있다.

이러한 문법이 상당히 많이 쓰이기 때문에 익숙해 져야한다.






POST방식으로 데이터를 보내는 방법

 - form 태그를 사용해서만 전달이 가능

 - 헤더가 아닌 메세지 바디를 통해 전달한다. 따라서 정보가 쉽게 공개되지 않는다.

 - 따라서 패킷을 직접 열어보지 않는 한 외부에서 확인이 어렵다.

 - 바디를 통해 전달하기 때문에 용량제한은 없다.


form 태그 : 입력형태를 지정하는 태그


반드시 form을 통해서만 데이터를 전달 할 수 있다.



# form 형식의 예제. https://www.w3schools.com/html/html_forms.asp 확인

ID 또는 PASSWORD를 입력하는 그런 폼을 의미한다. 또는 회원가입시 생년월일 입력란의 하단으로 펼쳐지는것 또한 폼에 해당한다.





form 의 주요 속성

 - action

 - method=GET | POST


즉, form 형식을 통해서도 GET방식으로 데이터 전달이 가능하다. 다시말해 GET방식의 전달은 URL으로만 가능하다는것이 아니다.



# 이 형태가 form 이다.






form 태그를 이용하여 이름과 나이를 전달받아보자.

이럴경우 입력폼과 출력폼을 따로 만드는것이 효율적이다.



# 이정도만 되어도 값을 입력 가능하다.

form.php파일을 하나 더 생성하고 HTML form 문법에 맞게 input.php 파일로 POST방식으로 값을 전달하는 형태이다.






# submit을 지정해주면 값을 입력받고 변수를 생성 및 값을 넘겨줄 수 있다.

value 부분을 지정해주면 디폴트 값을 따로 설정할 수 있다.

placeholder 방식을 요즘 많이 사용하는 추세이다.

value 와 placeholder의 차이점은 value는 값을 입력시 디폴트값을 지워야한다.

placeholder는 입력하려고 클릭하면 해당 디폴트값이 자동으로 지워진다.

또한 placeholder는 아무것도 입력하지 않고 submit하더라도 아무 값도 전송되지 않는다.

name속성으로 변수이름을 각각 name과 age로 지정해 준 것이다.






# form.php에서 Name과 Age 입력후 submit하면 input.php파일로 전송된다.

다시말해, 우리가 웹브라우저에서 form.php에 접근하면 값을 전달하며 input.php를 자동으로 호출한다.

이때 input.php파일은 POST방식으로 전달받기 때문에, 내부 코드를 $_POST로 수정해주어야한다.

POST로 전달했으면 서버쪽에서는 POST변수에 저장이 되기 때문.

POST방식이기때문에 URL뒤에 변수정보가 나타나지 않는다.

개발자모드의 하단에 Form Data에서 확인이 가능하다

POST방식은 form 외에는 전달이 불가능하다.






# POST로 전달되는 변수를 확인하려면 소스보기를 통해 name변수를 확인하면 된다.






# 위와같이 input.php 를 수정하면 form.php에서 아무값도 입력하지 않았을 경우 

input.php내에서 다시 폼을 출력할 수 있다.






#)_ 참고

 - 아무런 값이 없어도(NULL) 문자열 타입이다.

 - 입력값이 있는지 없는지 확인하려면 gettype 을 이용해서 가능하다.






#)_ 오류조치



#> netstat -ant 입력시 포트번호 80이 보여야한다. 페이지가 없다고 나타날 경우 이 방식을 시도해볼것.











댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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 29 30 31
글 보관함