[JavaScript] Cookie로 데이터 저장해보자.

     

     

     

    💭 쿠키의 구성

    // 기본 쿠키 설정
    document.cookie = "username=John Doe";
    
    // 쿠키에 만료일을 추가
    document.cookie = "username=John Doe; expires=Fri, 31 Dec 2024 23:59:59 GMT";
    
    // 도메인, 경로, 보안 설정
    document.cookie = "username=John Doe; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/; domain=example.com; Secure; HttpOnly";

    ChatGPT가 알려준 cookie의 구성 모습입니다.

     

    cookie를 삽입할 때, 다양한 형태로 저장하게 되는데, 왜 이런 형태가 나왔는지를 알아보도록 하겠습니다.

     

     

    💭 쿠키의 기본 규칙

    // 기본 쿠키 설정
    document.cookie = "userName=값";

    쿠키의 기본규칙은 Object처럼 key와 Value의 형태로 구성됩니다.

    keyvalue 의 규칙을 따른 것처럼 name과 value의 위치를 지니고 있습니다.

     

     

    💭 쿠키 확인하기

    //cookie 확인하기
    console.log(document.cookie);

     

    위의 cookie를 저장해 봤다면, 어떻게 저장되었는지 확인해 보도록 합니다.

    위에서 저장된 값이 그대로 표시된 것을 확인할 수 있습니다.

     

     

     

    💿 Cookie Option

    💭 Expires

    document.cookie = "username=John Doe; expires=Fri, 31 Dec 2024 23:59:59 GMT";

    cookie가 언제 삭제될 것인지를 정의하는 코드입니다.

    시간은 GMT 혹은 UTC형식을 따라옵니다. 해당 코드는 GMT형식입니다.

     

    ✔️  파기 날짜 입력하지 않을 경우, 브라우저 종료 시 쿠키 삭제 ( 해당 브라우저를 모두 종료 )

     

    let date = new Date();
    //현재 날짜에서 더하기
    date.setTime(date.getTime() + (day * 24 * 60 * 60 * 1000));
    console.log(date.toUTCString());
    expires = "; expires=" + date.toUTCString();
    
    document.cookie = "user=value; "+expires;

    해당코드를 직접 치기는 어려우니, JS의 DATE함수를 통해서 날짜형태를 잡아오도록 합니다.

    2번째 행의 day는 더하고 싶은 '일수'를 추가하시면 정해진 일수만큼 적용되어 진행됩니다.

     

     

    💭 Max-age

    document.cookie ="username=va; max-age=3600";

    Expires가 어렵다면, '초'를 계산해서 적용하는 방법도 있습니다.

    1의 단위는 1초이며, 1시간은 3600입니다.

     

    5를 입력하면, 5초 뒤 내가 지정한 cookie가 사라지는 것을 확인할 수 있습니다.

    max-age의 값을 -1로 설정할 경우, Cookie를 삭제할 수 있습니다.

     

     

     

    💭 Secure

    document.cookie="user=va; Secure";

    SSL에서만 cookie가 적용되도록 만들 수 있는 코드입니다.

    SSL은 URL창의 https를 의미합니다.

     

     

    💭 Domain

    document.cookie="user=va; Domain=localhost";

    도메인을 설정할 경우, 내가 만든 cookie가 해당 도메인에서만 실행되도록 설정 할 수 있습니다.

    도메인은 url창에 표시되는 주소를 말하며, 포트번호 앞부분까지가 도메인에 속합니다.

     

    여기서 서브도메인은 포함되지 않습니다.

     

    mail.naver.com => naver.com입니다.

     

     

     

    💭 Path

    document.cookie="user=va; path=/;";

    path입니다.

    기본적으로 파일의 위치에 해당되며, 혹은 IP와 port가 더 이상 확장이 안 될 때, port 다음으로 나타나는 URL코드이기도 합니다.

    기본적으로 현재 실행되고 있는 프로젝트의 폴더위치를 기준으로, 해당 폴더의 하위디렉터리 모두가 대상에 속합니다.

     

     

    💭 JS 접근 불가

    document.cookie="user=va; httpOnly";

    JS에서 코드에 대한 접근을 방지한다.

     

     

     

     

    🧲 Cookie 불러오기

    function getCookies(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1);
            if (c.indexOf(nameEQ) == 0) {
                return c.substring(nameEQ.length, c.length);
            }
        }
        return null;
    }
    
    //cookie 저장 형태
    cook=100; cook1=150

    여러 개의 cookie가 쌓였을 때, 내가 저장한 cookie를 조회하는 방법이다.

    getCookies 함수를 불러올 때, 불러오고 싶은 cookiename을 변수로 담아서 보내면, 값을 return 받을 수 있습니다.

     

     

    🧲 Cookie 삭제하기

    function delCookie() {
        let name=  document.getElementById('inpName').value;
        console.log('name: ', name);
        document.cookie = name + '=; Max-Age=-1;';
    }
    
    //Path=/으로 저장했을 경우
    document.cookie="user=va; Max-Age=-1; Path=/";

    Cookie를 저장했을 때, 반대로 Cookie를 지우는 방법입니다.

    Cookie를 지우기 위해서는 Max-Age 기능을 사용해야 합니다.

     

    여기서 주의 사항, cookie를 등록했을 때 옵션을 그대로 적용해야 한다는 부분입니다.

    만약, option이 일치하지 않는다면 cookie가 삭제되지 않는 일이 발생됩니다.

     

     

     

     🧲  마무리, cookie를 JSON으로 활용하기

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    
    <body>
        <input type="button" value="저장">
        <input type="button" value="불러오기">
        <input type="button" value="key 불러오기">
    
        <script>
            document.querySelectorAll('input[type="button"]')[0].addEventListener('click', () => {
                let obj = { 'id': 'apple', 'name': 'blue' };
                document.cookie = 'cook=' + JSON.stringify(obj);
            });
    
            document.querySelectorAll('input[type="button"]')[1].addEventListener('click', () => {
                console.log(document.cookie);
            })
    
            document.querySelectorAll('input[type="button"]')[2].addEventListener('click', () => {
                let cookieValue = getCookies('cook');
                console.log(cookieValue);
                let obj = JSON.parse(cookieValue);
                console.log(obj);
                console.log('id: ', obj.id);
            })
    
            function getCookies(name) {
                var nameEQ = name + "=";
                var ca = document.cookie.split(';');
                for (var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                    while (c.charAt(0) == ' ') c = c.substring(1);
                    if (c.indexOf(nameEQ) == 0) {
                        return c.substring(nameEQ.length, c.length);
                    }
                }
                return null;
            }
    
        </script>
    </body>
    
    </html>
    반응형

    'Web > JavaScript' 카테고리의 다른 글

    [JavaScript] Promise 확인하기  (0) 2024.09.03
    [Node] File BLOB로 저장하기  (0) 2024.04.23
    [JavaScript] CallBack 함수 사용하기  (1) 2023.11.20
    [JavaScript] Object 복사하기  (0) 2023.11.10
    [JavaScript] Date타입 다루기  (0) 2023.06.05

    댓글

    Designed by JB FACTORY