본문 바로가기

프로그래밍 공부/PHP

PHP - HTTP 헤더, 메일 송신 그리고 정규표현

HTTP 헤더

사용자가 웹 브라우저에서 웹 사이트를 열람할 때는 웹 서버와 웹 브라우저 사이에 보이지 않는 각종 정보가 교환되고 있는 상태이다. 이 모든 정보는 HTTP 헤더라는 부분에 기록되어 있다.

HTTP 헤더란?

요청 헤더와 응답 헤더로 나뉘어져 있다.

1. 요청 헤더
웹 서버와 웹 브라우저는 HTTP(Hypertext Transfer Protocol)라는 프로토콜(통신을 위한 규약)을 사용해서 서로 메세지를 교환하고 있다. 이 때 페이지를 열람할 때 웹 브라우저에서 웹 서버에 '요청'을 송신한다. '요청(request)'이란 메서드, 헤더, 데이터로 구성된 문자열을 뜻한다. 요청 메서드로 페이지를 표시하는 방법을 요구하면 요청 헤더에 웹 브라우저의 정보 등을 포함하여 송신이 된다.

프로그램에서는 특히 웹 브라우저의 종류나 OS 정보를 포함한 'User-Agent'와 어떤 페이지의 요청인지를 나타내는 'Referer'가 자주 이용된다.

2. 응답 헤더
웹 서버에서 '요청' 메세지를 받아 처리를 실행하고 상태 코드(Status Code)를 웹 브라우저로 송신한다. 상태 코드는 처리 결과를 3행의 숫자 코드로 돌려준다. 그리고 '응답(response)'을 웹 브라우저로 송신한다.

응답은 헤더와 데이터로 구성되어있다. 응답 헤더의 예로는 'HTTP/1.1 200 OK' 또는 'Server:Apache/2.4 4(Unix) PHP/5.6.11'등이 있다.

응답 헤더 송신하기

요청 헤더를 직접 조작하는 경우는 드믈지만, 응답 헤더에 대하여는 파일을 CSV 형식으로 내려받는 처리 과정 중 특별한 응답 헤더로 출력할 때가 있다.

1
2
3
4
5
6
7
8
9
10
<?php
    // 코드를 작동시키려면 test.data가 필요하다.
    // 응답 헤더 송신하기
    $downloadfile = "data.csv";
    header("Content-Disposition:attachment;filename=$downloadfile");
    header("Content-type:application/octet-stream;name=$downloadfile");
    
    $result = file_get_contents("test.data");
    print $result;
?>
cs

위의 코드에서 $downloadfile에 파일명을 넣는다. 이 파일명은 첫 번째와 두 번째 header 함수에 기술한다. 읽어 들일 파일명 'test.data'를 file_get_contents 함수에 지정하여 $result에 파일 내용을 넣고 print문으로 내려받을 파일 안에 써넣는다. 'test.data'를 PHP 파일과 같은 디렉터리에 위치시킨 후 PHP 파일을 실행하면 화면은 표시되지 않지만, 자동으로 'data.cav' 파일 형식으로 내려받을 수 있다.

만약 header 함수를 실행하기 전에 print문이나 HTML 태그가 있으면 오류가 발생하여 내려받는 파일 안에 해당 문자열이 그대로 나타난다.

리다이렉트

페이지에서 다른 페이지(또는 다른 사이트의 페이지)로 자동으로 이동하는 것을 리다이렉트라고 한다. 응답 헤더에서 'Location:URL'을 지정하여 웹 브라우저로 송신하면 리다이렉트를 할 수있다. 지정하는 URL은 상대 경로가 아닌 http://로 시작하는 절대 경로를 입력해야 한다.

1
2
3
4
5
<?php
    // 리다이렉트
    header("Location:http://www.naver.com/");
    exit;
?>
cs

또한 header 함수를 리다이렉트 용도로 사용하는 경우 반드시 'exit'을 작성해 불필요한 코드의 실행을 막아야한다.

메일 송신

사용자가 문의하기 페이지에서 입력한 내용을 메일로 받거나 웹에서 실행한 처리 결과를 메일로 받을 때 메일 함수를 사용한다.

메일 송신 설정

개발 중에는 실제로 메일을 송신하는 것보다 결과를 파일로 확인하는 쪽이 안전하고 편리하다. Windows용 XAMPP에서 메일 송신을 실행하면 모두 'xampp폴더의 mailoutput'에 저장되는 것으로 설정되어 있다. 메일을 송신하려면 XAMPP에 포함된 Mercury/32를 이용한다.

메일 송신

PHP에서 메일을 송신하는 함수로 mb_send_mail 함수가 있다. 이 함수의 인수에는 '받는 사람', '제목', '본문' 그리고 '추가 헤더'를 지정한다. 이 함수는 송신에 성공하면 TRUE를 실패하면 FALSE를 리턴한다.

추가 헤더를 지정하는 방법은 '받는 사람의 주소', '제목', '본문'을 모두 변수에 넣는다. 추가 헤더에는 메일의 발신인 등과 같은 헤더를 지정한다. 발신인의 헤더는 'From:'으로 시작하며 스페이스를 하나 입력한 뒤에 메일 주소를 작성한다. 따로 메일 주소를 지정하지 않으면 발신인으로 'root$localhost'와 같이 서버에 설정된 기존 메일 주소가 지정된다.

"(큰 따옴표)와 '(작은 따옴표)를 주의해야 하는데, 큰 따옴표로 둘러 싼 "From: 이메일@gmail.com\r\nCc: 이메일@gmail.com"을 작은 따옴표로 'From: 이메일@gmail.com\r\nCc: 이메일@gmail.com'으로 바꾸게 되면 \r\n이 개행코드가 아니라 문자 그대로 취급되어 정상적으로 동작하지 않을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    // 메일 송신 설정
    $to = "이메일@gmail.com";
    $subject = "발송 테스트";
    $message = "현재 메일 테스트 중입니다.";
    $add_header = "From: 이메일@gmail.com\r\nCc: 이메일@gmail.com";
 
    if(mb_send_mail($to,$subject,$message,$add_header)){
        print "메일을 발송하였습니다.";
    }else{
        print "메일 발송에 실패하였습니다.";
    }
?>
cs

mb_send_mail 함수에 인수로 각 변수를 지정한다. mb_send_mail 함수를 실행하고 송신이 성공하는 경우에는 TRUE가 되어 if 조건문의 블록 안에 있는 코드가 실행이 된다. 이 테스트를 할 때는 반드시 자신의 메일 주소로 송신을 해야한다.

정규표현

PHP에서 Perl과 같이 정규표현식을 기술할 수 있다. 정규표현은 '숫자의 패턴'이나 '문자의 패턴' 등을 '메타 문자(meta character)'라는 특별한 의미를 가지는 기호를 조합하여 표현하는 것을 말한다. 예를 들어, 웹 어플리케이션에서 입력 값으로 숫자 이외에 문자를 입력될 수 없도록 검사할 때 정규표현의 '숫자 패턴'을 사용하여 검사한다. 복잡한 처리도 정규표현으로 간단하게 작성할 수있다.

정규표현은 검색이나 치환 처리에 사용한다. preg_match와 mb_ereg_match 함수는 문자 패턴이 일치하는 것만 찾기 위한 함수이다. preg_match는 Perl 호환의 정규표현을 사용할 수 있다. mb_ereg_match 함수는 한국어 등과 같은 멀티바이트에 대응한다.

if 조건문에서 정규표현을 사용할 수 있다. preg_match 함수는 정규표현의 패턴과 일치하면 1을 일치하지 않으면 0을 돌려주고 오류가 발생하면 FALSE를 돌려준다. 조건식이 1이면 TRUE와 같이 if 조건문 블록 안의 코드가 실행이 된다. if 조건문이 0이면 FALSE와 같이 else문 안의 코드가 실행이 된다.

숫자 검사하기

1
2
3
4
5
6
7
8
9
10
<?php
    // 숫자 검사하기
    $number1 = "123456";
 
    if(preg_match("/[0-9]+/",$number)){
        print "숫자입니다.";
    }else{
        print "숫자 이외의 문자입니다.";
    }
?>
cs

 

$number에 숫자를 넣고 숫자가 일치하는 패턴의 정규표현을 작성한다. 숫자의 패턴은 '01234567890'과 같다. 또한 패턴에 -를 사용해 '0-9'와 같이 작성할 수도 있다. 여기에서 0부터 9까지의 숫자 하나를 표현할 수 있다. 여러 개의 숫자와 일치되게 하려면 +문자를 붙여 '[0-9]+'와 같이 작성하여 숫자와 일치하게 만든다.

preg_match()에는 '"/[0-9]+/"'처럼 작성하여 검사할 문자열과 함께 지정한다.

mb_ereg_replace와 preg_replace

preg_replace 함수는 정규표현을 사용한 치환 처리를 할 수 있다. 기능이 같은 함수로는 ereg_replace 함수가 있지만, preg_replace 함수는 정규표현을 지정할 때 '/정규표현/'과 같이 Perl 형식으로 지정한다. ereg_replace 함수에는 '//'를 입력할 필요가 없다. mb_ereg_replace 함수는 ereg_replace 함수를 멀티바이트로 취급하는 것이다. 

일치하는 문자열 참조

일치하는 문자열을 참조하려면 '"/([0-9]+)/"'와 같이 정규표현을 ()로 묶는다. 3개의 인수를 배열 $matches에 지정하면 $matches[0]에는 문자열 전체가, $matches[1]에는 첫 번째로 일치한 문자열이 $matches[2]에는 두 번째로 일치한 문자열이 할당된다.

1
2
3
4
5
6
7
8
9
10
11
<?php
    $number2 = "123456";
 
    if(preg_match("/([0-9][0-9])([0-9]+)/",$number,$matches)){
        print $matches[0];
        print "<br>";
        print $matches[1];
        print "<br>";
        print $matches[2];
    }
?>
cs

HTTP 헤더, 메일 송신 그리고 정규표현 함수 정리

함수 이름 함수 형태 함수 설명
header header("응답 헤더"); 응답 헤더 송신
Location:URL header("Location:절대 경로"); exit 리다이렉트
mb_send_mail mb_send_mail(받는 사람, 제목, 본문, 추가 헤더); 메일을 송신
preg_match preg_match(정규표현, 문자열); 정규표현 함수(Perl 호환)
mb_ereg_match mb_ereg_match(정규표현, 문자열); 정규표현 함수(멀티바이트)
preg_replace $변수 = preg_replace(정규표현, 치환 후 문자, 치환 대상 문자열);  치환 처리(Perl 호환)
mb_ereg_replace $변수 = mb_ereg_replace(정규표현, 치환 후 문자, 치환 대상 문자열);  치환처리(멀티바이트)