본문 바로가기

신입 개발자 면접 기초

Web - 쿠키와 세션의 차이, 용도, 사용법(cookie,session)

웹에서 쿠키와 세션

쿠키와 세션을 사용하는 이유

→ HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용한다.

HTTP 프로토콜의 특징

  1. 비연결지향(Connectionless)
    • HTTP는 클라이언트가 요청(Request)을 서버에 보내고, 서버는 클라이언트에게 적절한 응답(Response)을 주고 연결(Connection)을 끊는 특성이 있다.
      • HTTP1.1 버전에서는 커넥션을 계속 유지하고 요청(Request)에 재활용하는 기능이 추가되었다. (HTTP Header에 keep-alive 옵션을 주어 커넥션을 재활용하게 한다. HTTP1.1 버전에서는 디폴트(default)옵션이다.
    • HTTP가 TCP위에서 구현되었기 때문에(TCP는 연결지향, UDP는 비연결지향) 연결지향적이라고 할 수 있다는 얘기가 있어 논란이 있지만, 아직까지는 네트워크 관점에서 keep-alive는 옵션으로 두고, 서버측에서 비연결지향적인 특성으로 커넥션 관리에 대한 비용을 줄이는 것이 명확한 장점으로 보기 때문에 비연결지향으로 알아두었다.)
  2. 상태없음(Stateless)
    • 커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다.

HTTP는 이 두 가지 특성을 보완하기 위해서 쿠키세션 을 사용하게 되었다.

비연결지향이라는 특성 덕분에 계속해서 커넥션을 유지하지 않기 때문에 서버 리소스 낭비가 줄어드는 것은 아주 큰 장점이지만, 통신할 때마다 새로 커넥션을 만들기 때문에 클라이언트 측면에서는 상태를 유지(ex. 인증에 쓰이는 상태, ...)를 위해 통신할 때마다 어떤 절차를 가져야하는 단점이 생긴다.

심각하게 말하면 만약 쿠키와 세션이 없다면 어떤 페이지에서 다른 어떤 페이지로 넘어갈 때마다 인증을 다시 받아야하는 것이다.


쿠키(Cookie)

쿠키는 클라이언트 로컬(local)에 저장되는 키와 값(key, value)이 들어있는 작은 데이터 파일이다.

쿠키는 서버에서 HTTP Response Header에 Set-Cookie 속성을 이용하여 클라이언트에 쿠키를 제공한다.

쿠키에는 이름, 값, 만료 날짜/시간(쿠키 저장기간), 경로 정보등이 들어있다.

쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 요청(Request)할 때 참조된다.

쿠키는 서버측에서 만료 날짜/시간을 지정하여 정해진 시간동안 데이터(상태정보)를 유지할 수 있다. (로그인 상태 유지에 활용된다)

세션쿠키(Session Cookie)와 지속 쿠키(Persistent Cookie)

쿠키는 세션 쿠키(Session Cookie)지속 쿠키(Persistent Cookie) 로 나뉜다.

만료 날짜/시간을 지정하지 않으면 항상 유지하라는 것으로 판단하고 지속 쿠키에 저장되고, 만료 날짜/시간을 지정하면 세션 쿠키로 저장된다.

세션 쿠키는 브라우저 메모리에 저장되므로 브라우저가 종료되면 쿠키는 사라지게 된다.

지속 쿠키는 파일로 저장되므로 브라우저가 종료되어도 쿠키는 남아있게 된다.

→ 참고로 세션 쿠키의 값은 보안상 꽤나 안전한 브라우저(ex. 구글 크롬)의 메모리에 저장되기 때문에 보안에 유리하지만 파일로 저장되는 지속 쿠키의 경우 비교적으로 보안에 취약하다.

  • 쿠키 프로세스
    1. 브라우저에서 웹페이지에 접속한다.
    2. 클라이언트가 요청한 웹페이지를 응답으로 받으면서 HTTP 헤더를 통해 해당 서버에서 제공하는 쿠키 값을 응답으로 준다. (이러면 클라이언트는 해당 쿠키를 저장한다.)
    3. 클라이언트가 웹페이지를 요청한 서버에 재 요청시 받았던 쿠키 정보도 같이 HTTP 헤더에 담아서 요청한다.
    4. 서버는 클라이언트의 요청(Request)에서 쿠키 값을 참고하여 비즈니스 로직을 수행한다. (ex 로그인 상태 유지, ...)
  • 쿠키 사용 사례
    • 자동로그인, 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크, 쇼핑몰의 장바구니, ...
  • 쿠키의 한계
    • 클라이언트에 최대 300개 까지 쿠키를 저장할 수 있다.
    • 서버 도메인 하나당 최대 20개의 쿠키를 저장할 수 있다.
    • 하나의 쿠키 값은 최대 4KB까지 저장할 수 있다.

→ 쿠키는 사용자가 별도로 요청하지 않아도 브라우저(Client)에서 서버에 요청(Request) 시에 Request Header에 쿠키 값을 넣어 요청한다. (=자동이다.)

그렇다고 그 많은 쿠키 값을 굳이 모든 요청에 넣어서 비효율적으로 동작하지는 않는다. 도메인 설정을 통해서 지정한 도메인으로 요청할 때만 쿠키 값이 제공되도록 할 수도 있다.


세션(Session)

서버(Server)에 클라이언트의 상태 정보를 저장하는 기술로 논리적인 연결을 세션이라고 한다.

웹 서버에 클라이언트에 대한 정보를 저장하고 클라이언트에게는 클라이언트를 구분할 수 있는 ID를 부여하는데 이것을 세션아이디라 한다.

  • 세션 프로세스
    1. 클라이언트가 서버에 요청했을 때, 필요에 따라 세션에 클라이언트에 대한 데이터를 저장하고 세션 아이디를 응답을 통해 발급해준다. (브라우저 단에서 관리될 수 있도록 쿠키로 발급하는게 일반적인 구조)
    2. 클라이언트는 발급받은 세션 아이디를 쿠키로 저장한다. (ex. JSESSIONID)
    3. 클라이언트는 다시 서버에 요청할 때, 세션 아이디를 서버에 전달하여 상태 정보를 서버가 활용할 수 있도록 해준다.

결과적으로 세션을 통해 클라이언트의 정보는 서버에 두고, 세션 아이디를 이용해서 인증받고 정보를 이용하는 방식이다.

  • 세션 사용 사례
    • 로그인 정보 유지

쿠키와 세션의 차이

  • 저장 위치
    • 쿠키는 클라이언트(브라우저)에 메모리 또는 파일에 저장하고, 세션은 서버 메모리에 저장된다.
  • 보안
    • 쿠키는 클라이언트 로컬(local)에 저장되기도 하고 특히 파일로 저장되는 경우 탈취, 변조될 위험이 있고, Request/Response에서 스나이핑 당할 위험이 있어 보안이 비교적 취약하다. 반대로 Session은 클라이언트 정보 자체는 서버에 저장되어 있으므로 비교적 안전하다.
  • 라이프 사이클
    • 쿠키는 앞서 설명한 지속 쿠키의 경우에 브라우저를 종료하더라도 저장되어 있을 수 있는 반면에 세션은 서버에서 만료시간/날짜를 정해서 지워버릴 수 있기도 하고 세션 쿠키에 세션 아이디를 정한 경우, 브라우저 종료시 세션아이디가 날아갈 수 있다.
  • 속도
    • 쿠키에 정보가 있기 때문에 쿠키에 정보가 있기 때문에 서버에 요청시 헤더를 바로 참조하면 되므로 속도에서 유리하지만, 세션은 제공받은 세션아이디(Key)를 이용해서 서버에서 다시 데이터를 참조해야하므로 속도가 비교적 느릴 수 있다.

세션을 주로 사용하면 좋은데 왜 굳이 쿠키를 사용할까?

→ 세션은 서버에 데이터를 저장 즉, 서버의 자원을 사용하기 때문에 서버 자원에 한계가 있고 메모리를 사용하다보면 속도 저하도 올 수 있기 때문이다.

쿠키, 세션은 캐시와 엄연히 다르다

브라우저 캐시는 이미지(.png, .jpg, ...)나 .css, .js파일 등이 사용자의 브라우저에 저장이 되는 것이다.

이를 이용해 같은 자원을 로드(load)해야할 때, 해당 자원을 다시 불러오지 않고 캐시되어 있는 자원을 써서 클라이언트 자원을 아끼는 것이다.

해당 자원이 한 번 브라우저 캐시에 저장되면 다음 필요시에도 브라우저에 있는 걸 재사용하기 때문에 경우에 따라 해당 자원이 변경되어도 변경된 자원을 참조할 수 없는 경우가 생길 수 있다.

따라서 사용자는 브라우저 캐시를 지워주거나 서버에서 클라이언트로 응답을 보낼 때 header에 자원 캐시 만료시간을 명시하는 방법등을 이용하여 캐시를 회피할 수 있다.

보통 쿠키와 세션의 차이를 물어볼 때, 저장위치나 보안에 대해서는 대체적으로 대답을 잘 한다.

그런데 라이프 사이클에 대해서 얘기하지 않는 경우는 많은데 이런 것까지 디테일하게 대답해주는게 좋지 않을까한다.

추가적으로 이론적인 내용뿐만 아니라 실제 사용해보고 사례를 언급하면 더 좋지 않을까한다.

참고 사이트

http://88240.tistory.com/190

http://interconnection.tistory.com/74

→ 참고 사이트를 적는 건 최소한의 예의라고 생각합니다.

지식의 재생산, 정보 전달 측면에서 댓글 달아주시는 모든 분들께 출처 남겨주시고 인용가능하도록 하고 있습니다. 그런데 간혹 출처도 없이 심지어 내용도 그대로 베껴가는 건 최소한의 예의도 못 지킨 것 같아 아쉬움이 남습니다...저도 다른 글 참고하여 공부하고 정리하는 글이지만 최소한의 예의는 지켜봅시다...

  • Favicon of https://defacto-standard.tistory.com BlogIcon defacto standard 2018.03.29 21:49 신고

    명확하네요 라이프 사이클이 중요한지는 몰랐습니다

  • sam 2018.05.31 15:25

    감사합니다 :)

  • 띵구 2018.07.30 23:13

    Node.js 서버구축부터 정말 잘 활용하고 있습니다. 가능하시다면 제가 정리하는 블로그에 세션 정의를 사용해도 될까요??

  • Favicon of https://devhoma.tistory.com BlogIcon dolhim 2018.08.30 13:59 신고

    감사합니다 각 개념 이해하는데 도움이 되었어요!

  • Jaehee 2019.01.08 20:07

    감사합니다! 잘 정리해주셔서 이해하기 좋았습니다 :-)

  • orionjeong 2019.03.12 15:32

    항상 내용 잘보고 있습니다. 감사합니다 ㅎㅎ 질문이 있는데요, 세션이 브라우저 종료시 삭제된다고 햇는데 서버에서 브라우저의 종료를 알아차리고 삭제한다는 얘기인가요? 아니면 쿠키(sessionid)가 삭제된다는 것인가요? 쿠키가 삭제된다는 말이면 위에서 쿠키에 대한 설명으로 브라우저가 종료되어도 정보가 남아있을 수 있다고 하셨는데, 그럼 이것도 세션Id처럼 삭제시킬 수 있는건 아닌가요?? 좋은 내용을 읽다 갑자기 궁금증이 생겨 질문드립니다.

    • 위에 본문에서 설명드리지 않았습니다만 쿠키에도 종류가 있습니다.
      Session Cookie, persistent Cookie, Secure Cookie, Third-Party Cookie 이렇게 있습니다.

      Session 쿠키 -> 브라우저 애플리케이션의 메모리에 저장됩니다. 메모리에 저장되기 때문에 브라우저 애플리케이션이 종료되면 사라지는 특성이 있습니다.
      Persistent 쿠키 -> 오랜시간동안 유지되는 쿠키. 쿠키정보를 파일에 저장하기 때문에 브라우저가 종료되더라도 사용가능한 특성이 있습니다. (ex. 일주일동안 보지 않기, Max-Age 1주)

      1. 세션이 브라우저 종료시 삭제된다고 한 것은 클라이언트 측면에서 브라우저에 있는 세션 정보(Session Cookie)가 종료때 사라지는 것으로 이해하신게 맞습니다.
      서버입장에서는 브라우저가 닫혔는지 모릅니다.
      서버는 발급한 세션아이디가 사용되지 않는지 확인하고 삭제해야하는 로직이 필요한 것이죠.

      2. 브라우저가 종료되어도 사라지지 않는 쿠키는 persistent cookie로 등록된 것입니다.
      네이버나 구글에 로그인하기 전과 하신 후에 쿠키를 확인하시고 직접 세션정보가 담긴 쿠키를 삭제해보시면 더 이해가 잘될 것입니다. 구글은 SID, SSID등을 지워보시면되고 네이버는 NID를 지워보세요. 브라우저도 종료해보셨다가 다시 쿠키도 확인해보시면 좋을 것 같습니다.
      * 참고로 Session Cookie인지 Persistent Cookie인지는 Expires를 명시하거나 Max-Age를 명시한 경우 Persistent Cookie로 보고, 명시하지 않은 경우 Session Cookie로 봅니다.
      * 정확한 정보가 아닐 수 있습니다.

  • orionjeong 2019.03.12 23:23

    오 좋은 정보 감사합니다. ㅎㅎ 한 번에 의문이 해소되었습니다. 더 자세히 찾아보고 정리해보도록 하겠습니다. 제가 정씨라 호기심에 들어온 이 블로그에서 많은 지식들을 얻어갑니다. 포스트들을 한 번씩은 다 본거 같네요 ㅎㅎ 더 자주 들리겠습니다!

  • Favicon of https://studychfhd.tistory.com BlogIcon 초롱스쿨 2019.06.20 17:59 신고

    웹 공부하면서 정의가 잘되어 있어서 제 블로그에 사용하고자 하는데 가능할까요?!

  • roqkfwk 2020.01.15 10:24

    제가 이해한 것이 맞는 것인지 확인해주시면 감사하겠습니다.

    쿠키는 서버 측에서 서버에 정보를 요청한 사용자가 누구인지 판단하기 위해서 클라이언트 측에 저장하는 데이터 파일이고, 만료 기간은 서버 측에서 마음대로 정할 수 있다. 세션은 서버 측에서 발급된 세션id를 클라이언트 측의 세션쿠키에 저장하여, 사용자가 Request시 Request Header에 추가된 세션쿠키를 통해 서버 측에서 사용자가 누구인지 판단하고, 저장된 데이터를 사용할 수 있게 하는 기술이다. 브라우저가 종료되면 세션쿠키는 사라진다.
    세션도 결국 쿠키를 이용하긴 하지만 세션id정보밖에 들어있지 않아서 그냥 쿠키를 사용하는 것보다 트래픽 문제가 덜하다.

    결국 예를 들어 로그인 유지 기능을 만든다하더라도, 브라우저가 종료되도 로그인이 유지되는 기능을 구현한다면 쿠키(presistent-cookie)를 사용할 것이고, 브라우저가 실행되는 동안만 로그인이 유지되는 기능을 구현한다면 세션(session-cookie)을 사용할 수 있는 거죠?

    • 명확하게는 쿠키가 요청한 사용자가 누구인지 판단하기 위한 정보는 아닙니다.
      위의 예시처럼 단순한 정보들로 구성할 수 있습니다.(ex. 하루동안 보이지 않기(boolean))
      클라이언트(브라우저)에 저장되는 데이터라고 보시면 됩니다.
      어디를 접속하든 모든 요청에 브라우저의 쿠키가 전송될 겁니다. (domain 속성이나 여러 효율면에서 안 보낼 수 있음)
      세션 트래픽의 경우도 맞는 말씀이긴 하지만 어마어마한 차이가 아니라 핵심은 아니고요.
      쿠키에 개인 정보들이 직접 들어갔을 때 타 사이트에서도 그 정보에 접근 가능했던 문제점을 회피한게 핵심이라고 보시면 될 것 같습니다.

  • Favicon of https://sjs2215.tistory.com BlogIcon sjs_2215 2020.03.06 16:50 신고

    안녕하세요, 기술 블로그 많이 보고 다니는데 제일 깔끔하고 쉽게 글 쓰신 것 같습니다. 많이 보고 배우고 갑니다!!
    시간 되시면 제 블로그도 놀러오세요!
    (출처 남기고 블로그에 사용하였습니다!) https://sjs2215.tistory.com/

  • rayshoo 2020.03.25 10:27

    저도 출처 남기고 블로그에 담아갑니다 공부하느라 정리하는 블로그인데 만든지 아직 정말 얼마 안돼서 보여드릴게 없네요ㅜ 유익한 정보 감사합니다! 복받으세요!

  • Favicon of https://kyungjong.tistory.com BlogIcon 경종 2020.04.12 14:12 신고

    안녕하세요 웹개발을 배우고 있는 초보 지망생입니다. 공부하면서 하는 블로그가있는데 괜찮으시면 출처남기고 위에 글좀 담아가도 될까해서요 유익한정보 항상 감사드리고 자주 방문하게될것같네요!

  • 2020.04.21 16:03

    비밀댓글입니다

    • 말씀하신 내용이 맞습니다만, 쿠키와 세션을 분리하기는 어렵습니다.

      로그인을 유지해주는 것은 쿠키에 저장된 SESSIONID값을 기준 정보로하여 세션이 유효한지 확인하고,
      유효하면 정보를 제공하여 로그인이 유지되는 것으로 보이게 하는 것이기 때문에 "로그인을 유지해주는 건 세션 때문이다"라고 하면 애매해질 수 있습니다.

  • Favicon of https://hocheon.tistory.com BlogIcon byolee 2020.05.12 17:43 신고

    글 감사합니다!

  • 지나가던고양이 2020.07.15 21:52

    쿠키가 클라이언트측 저장이고 세션이 서버쪽 저장이라면
    쿠기가 안되는 상황에서 세션은 사용이 가능한가? 라는 면접질문도 있었다고 합니다...
    입문한 늙근이 초보인데 제가 실습만하고있지 기술(이론) 부분은 전무해서요 혹시 위 답을알고 계신가요?

    • 쿠키를 사용하는게 코드도 깔끔하고 보안적으로도 좋겠으나, 불가피한 경우에는 "로컬스토리지"를 이용할 수 있겠습니다.

      세션을 유지하려면 stateless이기 때문에 클라이언트에서 어떻게든 최소한의 ID값 또는 JWT토큰값과 같은 것을 저장해야합니다.
      로컬스토리지에 저장하면 보안에 취약한 부분이 생기는 문제가 있습니다... (토큰값이 털린다든지...)
      결과적으로 쿠키를 사용할 수 없는 상황에서도 세션 사용이 가능하겠네요.

  • Favicon of https://kpuls.tistory.com BlogIcon keePlus001 2020.08.04 16:45 신고

    세션을 Persistent 쿠키에 보관하도록하면, 세션일지라도 브라우저 종료시 세션 유지가 되지 않나요?

  • Favicon of https://kpuls.tistory.com BlogIcon keePlus001 2020.08.05 12:21 신고

    쿠키와 세션의 차이 - 라이프 사이클

    위 부분을 보다가 갑자기 조금 헷갈려서 질문 드렸습니다!!