[PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())


Study/PHP  2019. 9. 13. 23:08

안녕하세요. 명월입니다.


이 글은 PHP에서의 $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv()) 에 대한 글입니다.


먼저 위 변수들은 서버 정보 변수라 하겠습니다. 딱히 정해진 이름은 없는 것같아서 제가 정해 봤습니다.

이 서버 정보 변수들을 이해하기 전에 웹 환경에 대한 이해가 조금 필요합니다.


링크 - [정보 및 잡담] 웹 프로토콜


웹이란 간단하게 웹 서버와 브라우저간의 비동기 통신을 하는 프로그램입니다. 브라우저에서 url를 통해 웹 페이지를 요청하면(request) 서버에서는 그에 대해 html파일을 작성해서 브라우저로 응답합니다.(response)

아주 심플한 형식으로 javascript의 경우는 브라우저에서 html를 받으면 동작하는 스크립트 언어이고, php는 서버측에서 브라우저로 응답을 하기 위한 html를 작성하는 스크립트언어입니다.


이 때, 요청하는 방식이 두가지가 있는데 Get방식과 Post방식이 있습니다. Get의 경우는 브라우저의 주소창에 요청할 페이지뒤에 ?의 구분으로 데이터를 전송하는 것이고 Post방식은 데이터를 해더에 포함시켜 따로 전송하는 방식입니다.

각자 서버와 브라우저에 프로그램에 사용되는 데어터 값을 저장하는 데 cookie는 브라우저, 즉 클라이언트 측에 데이터를 저장하는 것이고 session은 서버 측에 데이터를 저장하는 것입니다.

그러나 브라우저(클라이언트) 단위로 어떤 session을 사용하는 지 구분을 하기 위해서 session값은 쿠키로 저장하여 요청을 할 때 session값을 받고 서버에 저장되어 있는 session을 가져오는 것입니다.


아주 심플하게 설명했으나 좀 더 자세히 알고 싶으면 아래 링크를 잠조해 주세요.

링크 - [정보 및 잡담] 웹 프로토콜

링크 - HTTP 개요 - HTTP | MDN


$_SERVER

링크 - https://www.php.net/manual/en/reserved.variables.server.php


$_SERVER는 서버의 환경 설정에 대한 정보가 있습니다.

<?php  
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_SERVER);?>
</body>
</html>

var_dump로 찍어보니 정보가 많이 있네요.

이 중에서 자주 쓸만한 변수는 'DOCUMENT_ROOT'와 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT' 등이 있겠습니다.

그 중에서 $_SERVER['DOCUMENT_ROOT']가 가장 많이 사용되겠습니다. 나중에 php 파일을 연결하거나 파일을 찾을 때, $_SERVER['DOCUMENT_ROOT']를 통해 절대 경로로 취득할 수 있습니다.

OS 정보도 있으면 좋을 텐데, 그건 없네요..


$GLOBALS

링크 - https://www.php.net/manual/en/language.variables.superglobals.php


$GLOBALS은 현재 프로그램 스탭상에 선언되어 있는 모든 변수라고 생각하면 됩니다.

<?php
  $data = "test";
  class Test {
    private $data = "class variable";
    public function setData(){
      $abc = "function variable";
    }
  }
  $obj = new Test();
  $obj->setData();
?>
<!DOCTYPE html>
<html>
<head>
    <title>title</title>
</head>
<body>
  <?php var_dump($GLOBALS);?>
</body>
</html>

위 출력 결과를 보면 $_SERVER의 데이터도 보이네요. 그리고 $data와 Test 클래스도 $obj로 선언했으니 그 안의 private값까지 모두 표시됩니다. 이게 모든 데이터가 표시되니 꽤 위험한 변수입니다.

잘못 production에 출력되면 웹사이트가 뚫려 버릴 수도 있겠네요..

$GLOBALS는 array형식으로 되어 있으니 $GLOBALS["data"] 이렇게도 데이터를 가져올 수 있고 설정할 수도 있습니다.


$_GET

링크 - https://www.php.net/manual/en/reserved.variables.get.php


$_GET은 브라우저에서 페이지 요청을 받을 때, 받는 get 데이터값입니다.

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_GET);?>
</body>
</html>

위 예제처럼 브라우저 url에 localhost/index.php?data=1&test=helloworld라고 요청했습니다.

이는 localhost/index.php까지는 index.php를 요청하는 것이고 ? 뒤로는 get방식의 데이터를 보내는 것입니다.

변수의 구분은 &로 구분을 하고 data의 변수와 test의 변수에 각각 1과 helloworld의 값을 보냈습니다.

특징은 1이라는 숫자를 보냈는데 string으로 인식을 합니다. 즉 get방식으로 보내는 데이터는 전부 string으로 인식을 하니 숫자로써 사용하려면 형 변환이 필요합니다.


$_POST

링크 - https://www.php.net/manual/en/reserved.variables.post.php


$_GET은 브라우저에서 페이지 요청을 받을 때, 받는 post 데이터값 입니다. post값은 form태그를 이용해서 method를 post설정하고 submit을 하면 값을 보낼 수 있습니다.

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_POST);?>
  <form method="post">
    <input type="text" name="data">
    <input type="text" name="test">
    <input type="submit" value="go!">
  </form>
</body>
</html>

위 예제를 보면 처음 페이지를 요청할 때는 get방식(url를 직접치고 들어가는 방식)으로 요청을 하였기 때문에 $_POST값이 없습니다. 거기에 textbox에 값을 넣고 submit 버튼을 누르면 그 데이터가 서버로 전송이 되어 표시되는 것을 확인할 수 있습니다.

변수명은 input의 name으로 결정됩니다. 첫번째 textbox의 name은 data이니 data=1, 두번째는 test이니 test=hello world로 전송됩니다.


$_REQUEST

링크 - https://www.php.net/manual/en/reserved.variables.request.php


$_REQUEST는 $_GET, $_POST의 모든 값입니다. (위 링크에는 $_COOKIE값도 나온다고 되어 있는데 제가 확인해 본 결과 $_COOKIE값은 안 나옵니다.)

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_GET);?>
  <?php var_dump($_POST);?>
  <?php var_dump($_REQUEST);?>
  <form method="post">
    <input type="text" name="data">
    <input type="text" name="posttest">
    <input type="submit" value="go!">
  </form>
</body>
</html>

get방식으로 data와 test값을 post값으로 data와 posttest값을 요청했습니다.

결과는 만약 get값과 post값이 중복이 될 경우 post의 값이 나오네요. $_REQUEST는 요청방식에 관계없이 데이터가 나오는 건 좋은데, 좀 여러가지 문제가 될 소지가 많은 변수네요.

저도 잘 사용하지 않습니다.


$_COOKIE

링크 - https://www.php.net/manual/en/reserved.variables.cookies.php


사실 cookie나 session을 이해하려면 웹 프로그램에 대한 개념을 좀 더 공부를 해야 합니다. 여기서는 개념을 안다는 전재하에 설명하겠습니다.

브라우저의 cookie값은 일단 브라우저에서 서버측으로 전부 전송을 합니다. 그러므로 서버측에서도 브라우저의 쿠키값을 알 수 있습니다. (참고로 나라별로 정보 통신법이 다릅니다만 일부 국가에서는 cookie 수집이 불법입니다. 한국은 해당사항 없습니다.)

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_COOKIE);?>
</body>
</html>

일단 쿠키설정을 위한 프로그램을 만들기는 번거롭기 때문에 브라우저의 개발자모드를 이용해서 쿠키값을 만들어 넣었습니다. 처음에는 값이 없기 때문에 null이 나옵니다만 제가 data와 test값을 넣었습니다.

그렇게하고 재 요청을 하면 $_COOKIE값이 출력이 되네요.


$_SESSION

링크 - https://www.php.net/manual/en/reserved.variables.session.php


cookie는 브라우저에 저장되는 데이터 값이라고 하면 session은 서버 측에 저장되는 cookie값입니다. 물론 session은 요청되는 브라우저의 의해 구분되어서 저장됩니다.

<?php
  session_start();
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_SESSION);?>
</body>
</html>
<?php 
  $_SESSION["sessionTest"] = "good job";
?>

php에서 세션을 사용하려면 상단에 session_start()함수를 넣어야 합니다. session_start()함수의 역할은 브라우저의 쿠키에 session키를 부여하는 역할을 합니다. 첫번째 이미지를 보면 response로 Set-Cookie값에 cookie를 넣으라는 명령어 응답이 있습니다.

링크 - https://www.php.net/manual/en/function.session-start.php


다시 재 접속을 하면 session의 sessionTest값에 good job이라는 데이터가 들어가 있는 것을 확인할 수 있습니다. session값은 서버측에서 제거하거나 session이 만료되거나 쿠키값이 만료되면 사라집니다.


$_FILES

링크 - https://www.php.net/manual/en/reserved.variables.files.php


$_FILES은 브라우저에서 file를 업로드할 때 받는 데이터입니다.

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_FILES);?>
  <form method="post" enctype="multipart/form-data">
    <input type="file" name="data">
    <input type="submit" value="go!">
  </form>
</body>
</html>

위에서 파일을 전송하면 $_FILES로 데이터를 받습니다. 실제 업로드된 파일은 $_FILES["tmp_name"]에 임시로 저장이 되는데 프로그램에서 읽어서 데이터베이스나 다른 디렉토리에 저장하면 됩니다.

$_FILES는 IO할때 자세히 설명하겠습니다.


$_ENV

링크 - https://www.php.net/manual/en/reserved.variables.environment.php


$_ENV는 환경변수 설정값이 나오는 변수인데 저는 null나오네요.. 구글링으로 조사를 해봤는데 시원한 답변이 없습니다.

위 메뉴얼을 보면 $_ENV는 getenv()함수와 같은 역할이라고 설명되었습니다. getenv()는 잘 나오는데 왜 $_ENV는 안나오는지...ㅠㅠ

<?php
?>
<!DOCTYPE html>
<html>
<head>
  <title>title</title>
</head>
<body>
  <?php var_dump($_ENV);?>
  <?php var_dump(getenv());?>
</body>
</html>

일단 제 pc정보가 나와서 모자이크 처리했습니다. 제 pc의 시스템 환경 변수값이 다 나오네요. 환경변수라 하면 아래의 이미지를 이야기하는 것입니다.

우와 아주 간단하게 쓰려고 했었는데 내용이 상당히 많네요..


여기까지 PHP에서의 $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.