dinist

[Apache] http 요청을 https로 Redirect하기 본문

Google Cloud Platform/Compute Engine

[Apache] http 요청을 https로 Redirect하기

dinist 2020. 8. 11. 20:15

최근 Let's Encrypt를 통해 SSL을 적용하였다.

SSL이 적용된 HTTPS페이지에 접속하려면 https://로 시작해야한다. 하지만 웹브라우저에서 그냥 URL만 입력하면

http로 요청되는점이 있다. 그래서 HTTP요청을 하면 HTTPS로 자동으로 Redirect 하도록 해보자.

 

먼저 mod_rewrite 모듈이 있어야한다. 하지만 CentOS에 설치된 Apache httpd에는 mod_rewrite가 기본적으로 설치되고, 로드된다.

 

sudo vim /etc/httpd/conf/httpd.conf 명령으로 httpd.conf파일을 편집한다. 그리고 다음과 같은 내용을 추가한다.

 

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=308,L]

RewriteEngine : 모듈을 사용할 것인지 결정한다. On이면 사용 Off면 사용하지 않는다. 여기서는 On으로 설정

 

RewriteCond : 특정 조건을 이용하여 처리해야할 경우 사용한다.

RewriteCond의 문법은 다음과 같다.

 

RewriteCond TestString CondPattern [flags]

 

여기서 TestString은 %{HTTPS} CondPattern은 !=on이다. CondPattern은 정규표현식이 올 수 있다.

여기서는 %{HTTPS} !=on이라고 설정했는데 이는 서버 내부 변수중 하나인 HTTPS의 설정이 on일 경우 SSL, TLS를 사용중인 의미이고, off일 경우 HTTP를 사용중인 경우이다.

 

즉 %{HTTPS} !=on 이것은 SSL,TLS를 사용중인지 여부를 확인하는 것이다. ON이 아니라면 OFF일 것이고 OFF라는 것은 HTTP요청이라는 의미이므로, 저 조건에서 참일경우에는 http통신 거짓일경우에는 SSL,TLS 통신이라는 의미이다.

 

RewriteRule : 조건에 따른 rewrite url을 설정하고, 설정에 따른 동작을 지정한다.

RewriteRule의 문법은 다음과 같다.

RewriteRule pattern url [flag]

 

pattern부분에는 .*을 작성한다.   '.'은 임의의 한글자를 의미하고 '*'은 직전 문자가 0번또는 그 이상 반복됨을 의미한다.

즉 .*은 하나 이상의 문자를 포함하는 문자열을 의미한다.

 

이후 url부분에는 https://%{SERVER_NAME}%{REQUEST_URI} 라고 설정되어있다.

SERVER_NAME은 현재 동작중인 sever의 name을 가져온다. (httpd.conf 파일내에 설정된 값을 가져옴)

REQUEST_URI는 HTTP에서 요청한 URI를 의미한다.

 

이후 flag부분에는 R=308,L이라고 설정되어있는데 R은 Redirect를 의미한다. 리다이렉트는 주로 301,308 302,307을 사용한다.

 

301과 308은 Permanent Redirect로 영구적 이동을 의미한다. 301,308로 Redirect하면 봇의 입장에서는 영구적 변경으로 감지하고 변경된 URL을 감지한다. 하지만 302,307는 Temporary Redirect로 일시적인 Redirect로 생각하기 때문이다.

 

그럼 301과 302 , 307과 308의 차이는 무엇일까?

301, 302 Redirect는 Redirect시 무조건 GET으로 Redirect 처리를 한다. 그래서 처음 요청이 POST요청일경우 Redirect를 할때는 GET요청으로 바뀌어 Redirect된다. 그래서 POST요청시 문제가 생긴다.

하지만 307과 308은 Redirect시 각 처음 요청에 맞게 Redirect 처리를 한다. 처음 요청이 POST요청일 경우 Redirect 처리할때도 POST로 처리한다.

 

L은 이 이후 mod_rewrite 룰 설정을 더이상 처리 하지 않아도 된다는 의미이다. 

 

이렇게 설정을 추가해주고 저장 후

 

sudo systemctl restart httpd 또는 sudo service httpd restart를 통해 httpd 데몬을 재시작해주면 적용이 된다.

이제 확인해보자.

 

 

http로 요청을 해보니 308 Redirect 처리를 한다.

그 이후에는 https 페이지를 로드할 것이다.

 

 

443Port를 사용한 HTTPS연결이 잘 된다!

여기까지 http를 https로 Redirect하는 방법에 대해 알아봤다.