이미지를 서브 도메인 형식의 cdn으로 돌리는 경우가 있는데 말입니다.

현재 사이트의 도메인과 cdn의 서브 도메인과 비교할 수 있는 방법이 있는지 자문을 구하고자 합니다.

 

가령 현재 자기 사이트의 도메인이 dev.xetown.co.kr일 수도 있고 xetown.com일 수 있는데, 이때 cdn의 서브 도메인이 img.xetown.co.kr이라면 img.xetown.co.kr이 현재 사이트와 같은 계열의 도메인이라는 것을 확인할 수 있는 방법이 있을까요?

 

하나의 사이트에서만 확인하는 경우라면 막코딩을 해서 어떻게든 비교를 해볼 수는 있을 것 같은데,

범용 자료(사실은 링크 프리뷰 모듈입니다ㅎ)에서 주어진 url을 확인하는 과정은 이런저런 돌발상황들이 있기 마련이어서 좀 더 체계적인 접근이 있을지 궁금합니다.

  • profile

    자문자답입니다.

     

    처음에는 라이믹스에 내장된 isSameHost 메소드를 써볼까 했는데, 이건 서브도메인 비교는 안 되는 것 같더라구요.

    https://xetown.com/tips/1555592 의 댓글 참조

     

    그래서 새로 함수를 짜봤습니다.

    일단 url에서 hostname을 추출한 뒤 다음과 같이 재귀함수(getDomainFromSubdomain)를 돌려서 도메인을 추출하고, 두 도메인을 비교해주는 함수 isSameDomain으로 ture/false를 반환받으면 되는 듯합니다.

    (과연 잘 될 것인지...)

     

    console.log(isSameDomain('//xetown.com/questions/1720289', 'http://dev.xetown.co.kr/dev'));
    console.log(isSameDomain('https://xetown.com/questions/1720289', 'https://xetown.co.kr/31645'));
    console.log(isSameDomain('https://xetown.com/questions/1720289', '//dev.xetown.com/index.php?mid=sdkjafh'));
    console.log(isSameDomain('//xetown.com/questions/1720289', 'https://www.xetown.com/dskjhfsdaf/dispBoardContent'));
    console.log(isSameDomain('https://xetown.com/questions/1720289', 'http://xetown.com/dev'));
    console.log(isSameDomain('https://xetown.com/questions/1720289', '//img.xetown.com/asdlkfh.jpg'));
    console.log(isSameDomain('https://xetown.com/questions/1720289', 'http://img.xetown.kr/src/sdakjhf.png?width=360&height=640'));
    
    function isSameDomain(url1, url2) {
        if ( url1.indexOf('//') === 0 ) {
            url1 = url1.replace('//', 'https://');
        }
        if ( url2.indexOf('//') === 0 ) {
            url2 = url2.replace('//', 'https://');
        }
    
        var host1 = new URL(url1).hostname;
        var domain1 = getDomainFromSubdomain(host1);
        var host2 = new URL(url2).hostname;
        var domain2 = getDomainFromSubdomain(host2);
      
        return domain1 === domain2;
    }
    
    function getDomainFromSubdomain(given_host) {
        var host = given_host.toLowerCase();
        var count = host.split('.').length;
        if ( count === 3 ) {
            if ( host.split('.')[1].length > 2 ) {
                host = host.split('.').splice(1).join('.');
            }
        } else if ( count > 3 ) {
            host = getDomainFromSubdomain(host.split('.').splice(1).join('.'));
        }
        return host;
    }

     

    이렇게 했을 때 dev.xetown.co.kr과 img.xetown.com, 그리고 xetown.com과 img.xetown.co.kr의 경우는 서로 다른 도메인으로 판정하네요.

    이건 뭐 어쩔 수 없는 듯;;;

  • profile

    현재 사이트의 "도메인"이라는 기준 자체가 애매하다는 현실이 문제입니다.

    만약 현재 페이지의 hostname이 www.xetown.com이라면 img.xetown.com은 현재 사이트의 서브도메인인가요 아닌가요? 진짜 서브도메인이라면 img.www.xetown.com이어야 하는 것 아닐까요? 기술적으로는 그게 맞는데, 현실에서는 www 떼고 판단하는 것이 상식이죠.

    음, 그러면 앞에 한 단계는 떼고 비교해 볼까요? 만약 현재 사이트가 xetown.cafe24.com처럼 호스팅 업체에서 받은 무료도메인이라면? hosting.cafe24.com을 내 사이트의 서브도메인으로 취급할 이유가 있을까요?

    도메인이 com으로 끝나는 경우와 co.kr로 끝나는 경우를 구분하기 위해 조건문을 넣어놓으신 것 같긴 한데... 세상에는 org.uk, seoul.kr 등 워낙 이상한 도메인이 많기 때문에 그것만으로는 부족합니다. amc.seoul.kr과 sdf.seoul.kr은 서로 아무 관련 없는 사이트이지만, aaa.xetown.kr과 bbb.xetown.kr은 같은 사람 소유일 가능성이 무척 높지요. 브라우저 개발사들도 이런 예외 목록을 수작업으로 만들어서 보안정책에 활용하고 있어요. 국내 호스팅 업체들의 무료 서브도메인은 이 목록에 포함되어 있지 않아서 위험한 경우가 많고요.

  • profile profile
    cafe24.com seoul.kr 같은 게 있었지요;;;
    구글링하면서도 만족할 만한 정보를 얻기 어려웠는데 역시 힘든 일인가 봅니다.

    그냥 관리자가 설정에서 cdn 서버 도메인 입력하게끔 하고, 그것을 기준으로 필요한 명령을 실행해야 할 것 같네요;;;