Computer/PHP

443번 포트가 아닌 포트일때 로그인,글쓰기 안되는 사람이 있다.

알찬돌삐 2013. 5. 7. 23:57

카페24 때문에 별 작업을 다 해보는구나.

우리가 인터넷을 할때 http://daum.net 이라고 입력하고 접속을 하지만, 이것이 사실은 http://daum.net:80 을 뜻한다.

http 는 80 번 포트로 통신하겠다고 규약을 정해두었으니 뒤에 포트번호를 생략해도 접속이 되는것이다. (FTP, SSH 등도 동일하다.)


HTTPS (SSL) 은 기본적으로 443 번 포트를 사용한다.

HTTPS 로 접속시 서버의 인증서[각주:1]가 존재하여야 하는데, 단일도메인 인증서의 경우 웹호스팅에서 문제가 발생한다.

멀티도메인인증서의 경우 여러개의 도메인을 사용할 수 있는 인증서이다. (엄밀히 말하면 443번 포트를 같이 쓰기 위한 것이 아닌 인증서 하나로 여러개의 도메인을 사용하기 위해서 나온것이긴 하지만...)

이것이 편하긴 한데, 운영중 신규 도메인이 추가될 경우 전체 도메인에 대해서 갱신을 다시 해야한다. (비용의 압박)


동일한 서버에 단일도메인 인증서가 두개가 있다고 한다면, (단일도메인 인증서일때.. 와일드카드인증서는 해당없음)

https://cafe.daum.net

https://mail.daum.net

위와 같은 형태로 한서버에 443번 포트를 같이 사용할 수 없다. 

즉, 같은 443 번 포트를 사용하여 도메인에 따라서 서로 다른 인증서를 할당할 수 없다는 것이다.

어디선가 이걸 구별할수 있는 것이 추진중이라고 하는것 같은데 아직까진 미정이다.


그리하여 여러명의 사용자가 입주한 웹호스팅 환경에서는

https://도메인 (443 포트는 뒤에 포트번호를 생략하여도 된다.)

https://도메인:444

https://도메인:445

https://도메인:446

처럼 서로 다른 포트를 할당하여 보안프토콜을 이용하여 접속하게 된다.


대부분의 경우 이렇게 사용하는것이 문제가 없으나,

얼마전 단독 서버를 사용하는 고객사의 홈페이지를 비용절감차원에서 카페24의 웹호스팅으로 이전하였는데,

홈페이지에 접속이 안된다는 사람이 있는것이다.



작업할때는 몰랐는데, 회사에서 접속하니 접속이 되질 않는다.

이유는.... 방화벽에서 10000번 포트이상으로 나가는 아웃바운드를 차단해두었다.

대부분의 토렌트나 웹하드 등의 프로그램이 10,000번 이상의 포트를 사용하기 때문에 회사 방화벽 정책도 이렇게 적용해두었다.

카페24에서 할당한 HTTPS 포트는 48751 이다.

몇개의 사이트를 할당받아봤지만 거의 대부분이 45000번 이후의 포트가 할당되었다. 다른 분은 8000번대를 받은 사람도 있었으나, 내가 받은것은 대부분 40000번 이후 포트 ㅠ.ㅠ

카페24 고객센터에 요청하여 이러저러한 사정으로 인하여 포트번호를 10,000번 이하로 할당해주십사 하니 거절당했다.ㅎㅎ.

급한대로 위 고객사는 단독웹호스팅으로 이전하는걸로 마무리지었다.

그리고 얼마뒤.....

다른 고객사의 리뉴얼 작업.

이번 고객사는 SSL 인증서를 구매하지 않았다. 나 역시 편하지만 그래선 안된다. ㅠ.ㅠ

보안인증서를 도입하라는 정부정책을 떠나서 할건 하는게 맞는것 같다.

그래서 startssl.com 에서 1년 무료인증서를 발급받아 작업을 해주었다.

이번에도 카페24에서 할당한 SSL 포트는 48796 이다.


작업을 마무리 짓고 저번 고객사의 일도 생각나서 윈도우방화벽에서 48796 포트를 차단하고 테스트하니 당연히 안된다. ^^....

안되는건 안되는거지만 로그인조차 안되는건 곤란하다 -_-.......

당연히 데이터를 전송하는 부분은 SSL 을 적용해두었기 때문에. 글쓰기조차 안된다.


확 SSL 을 걷어내버릴까... 하는 마음도 들었지만,

그것보다는 SSL 이 접속되는 사람은 SSL 접속을 하게 두고,

안되는 사람은 HTTP 로 접속하게 하는 방향으로 소스를 수정하였다.


간단히 설명하자면,

1. 처음 홈페이지 접속

2. 로그인을 하던 안하던 세션을 생성한다. 

3. 세션데이터에 나에게 할당된 HTTPS 포트로 접속여부 값이 있는지 확인

4. 해당 데이터가 없으면 화면상에 보이지 않는 IMG 태그를 만들어, https://도메인:48796/이미지.jpg 로 접속하도록 한다.

   실제론 이미지가 아닌 세션에 데이터를 넣는 파일이다.

5. 해당 IMG 태그에 error 이벤트를 바인딩한다.

6. 이미지.jpg 에 HTTPS 로 접속요청이 오면 세션데이터에 HTTPS 접근가능이라고 세션값을 넣어둔다.

   만약 접속이 되질 않으면 5번에서 할당한 error 이벤트에 의거 HTTPS 가 아닌 HTTP 로 접속하고,

   이미지.jpg 에서는 HTTPS 에 접속할수 없었다는 세션값을 넣어둔다.


이렇게 한후,

로그인이나 글쓰기 작업을 할때 해당 세션값을 체크하여 HTTPS 가 접속가능하면 HTTPS 로 데이터를 전송하고,

그게 아니라면 HTTP 로 접속하는걸로 마무리를 지었다.


뭔가 더 좋은 방법이 있으려나......



  1. SSL인증서란 웹서버 인증서, 서버 인증서 라고도 하며 일반 사용자(클라이언트)가 사이트(서비스 서버, naver등과 같은 일반 사이트 및 쇼핑몰등)에 접속할때 주고받는 모든 정보(아이디등의 회원정보나, 결제시 신용카드 정보등)를 암호화해주는 것으로서 SSL(Secure Socket Layer)통신을 이용합니다. [본문으로]