쿠키 생성시 도메인 설정

Caesars·2021년 7월 26일
1

JS

목록 보기
1/8

목적

외부 스크립트를 설치하여 사이트 내 쿠키 생성 시 도메인 설정 방법에 대해 설명한다.
도메인 설정 없이도 쿠키 생성이 가능하지만 설정 하지 않을 경우에 생기는 문제점에 대해 서술한다.

도메인 설정 없이 쿠키 생성

링크텍스트 스택오버플로우에서 가장 많은 추천을 받은 쿠키 설정 코드이다.

아래 코드로 서브 도메인이 있는 사이트에서 테스트를 진행해보았다.

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}

setCookie('ppkcookie','testcookie',7);

도메인을 설정하지 않을 경우 브라우저 에서 자동으로 도메인 값을 설정하므로 map.naver.com 으로 도메인 값이 생성되었다.

문제점

이 상태에서 최상위 도메인 (www.naver.com)으로 이동시 위 페이지에서 생성한 쿠키를 가져 올 수 없다.
가져올 수 있는 쿠키는 도메인 값이 .naver.com 이나 www.naver.com 으로 설정된 쿠키이다.
이 경우 같은 사이트에서 페이지 이동만 했음에도 subDomain마다 쿠키를 생성하게 된다.

쿠키 생성 시 도메인 설정

도메인 값을 설정하는 코드는 다음과 같다.

window hostname을 도트를 기준으로 나누고 .net 이나 .com 과 같은 탑레벨 도메인인 경우 배열의 마지막 3개, 아닌 경우 2개를 붙여서 도메인 값을 생성한다.

function setCookieHour(ckNam, ckVal, ckHour) {

    var expire = new Date();
    
    if(ckHour>=1){
        expire.setHours(expire.getHours() + ckHour);
    }else{
        expire.setTime(expire.getTime()+(ckHour*60*60*1000));
    }
    
    expire.setHours(expire.getHours() + ckHour);

    var cookies = ckNam + "=" + escape(ckVal) + "; path=/ "; // Escape for preventing is breaking Korean.
    
    cookies += ";expires=" + expire.toGMTString() + ";";
    cookies += '; domain=.' + getDomainWithoutSubdomain() + ';'
    
    d.cookie = cookies;
    
}

function getDomainWithoutSubdomain() {
    var urlParts = window.location.hostname.split('.');
    var subDomainArr = ["co", "go", "or", "ac", "ne"] 
    var countryDomainArr = ["kr", "jp", "cn", "us"];
    var isTopLevelDomain = true;
    
    subDomainArr.forEach(function(subDomain){
        countryDomainArr.forEach(function(countryDomain){
            if(urlParts.length > 1 && subDomain == urlParts[urlParts.length - 2] && countryDomain == urlParts[urlParts.length - 1]){
                isTopLevelDomain = false;
            }
        });
    });
    
    return urlParts
        .slice(0)
        .slice(-(urlParts.length === 4 || isTopLevelDomain == false ? 3 : 2))
        .join('.');
}
profile
잊기전에 저장

0개의 댓글