쿠키와 세션에 관한 질문입니다.

조회수 4961회

안녕하세요 여러가지 개념 정리를 하다가 궁금한 것이 생겨서 이렇게 글 올려봅니다.

일단 제가 이해한 쿠키와 세션에 대해서 적어보겠습니다.

세션과 쿠키의 배경 : http 프로토콜은 stateless 라서 지속적인? 연결을 위해 사용하는 것 세션 : 서버측에 저장하는 식별자로서 클라이언트 별로 하나의 식별자를 제공한다. 쿠키 : 클라이언트 측에 저장하는 식별자로서 도메인당 20개까지 저장이 가능(쿠키 자체는 300개까지 저장, 하나당 4kb)

여러 블로그들을 검색하다 보니 정보가 혼합되어서 최대한 간단하게 적어보려고 했습니다.

이렇게 이해하다 보니까 궁금한 것이 생겼는데요

1 쿠키와 세션은 '항상' 동시에 사용하는 것인가요? 쿠키는 클라이언트측에 세션은 서버측에 저장한다고 하는데 만약 하나만 사용할 경우

  • 쿠키만 사용했을 때, 쿠키에 있는 식별자를 서버측에서는 어떻게 처리하는가? 결국은 그 식별자를 서버에서도 가지고 있어야하지 않은가? 라는 의문이 생기고
  • 세션만 사용했을 때, 클라이언트별로 하나씩 부여한다는데 클라이언트측에서 요청이 들어왔을 때 그 안에 식별자가 들어있지 않으면 어떻게 같은 클라이언트인지 구분하는가? 라는 의문이 생겼습니다.

그래서 제가 자체적으로 내린 결론은 쿠키와 세션은 동시에 존재하며 식별자가 클라이언트 측에 저장된 것을 쿠키, 서버측에 저장된 것을 세션 이라고 생각을 하고 있는데 검색을 해봐도 이게 정확한 것인지 몰라서 이렇게 질문 올려봅니다.

2 이 네트워크 유지? 상태 유지? 와 관련된 용어들이 쿠키, 세션 말고 다른 것들이 또 어떤 것이 있을 까요?

감사합니다!

  • (•́ ✖ •̀)
    알 수 없는 사용자

3 답변

  • 쿠키

    • 쿠키는 이해한 바대로 키와 값으로 구성되는데 모든 내용이 클라이언트측에서 저장됩니다.
    • 저잔된내용은 서버에 요청할 때 마다 http헤더에 쿠키 내용 (키와 값)을 전달합니다.
    • 서버의 응답헤더에도 쿠키관리지시에 대한 헤더가 있습니다.
    • 따라서 클라이언트에서 쿠키정보를 위변조할 위험성을 내포하고있습니다.

    세션

    • 쿠키의 위험성을 보완하기위해서 클라이언트에 대응하는 쿠키정보를 서버에서 저장하는 것입니다.
    • 하지만 서버에서는 저장된 세션과 클라이언트를 매칭하기위해서 세션 식별정보를 클라이언트에 남겨둬야 합니다.
    • 세션식별자를 쿠키로 저장하는 것이 보편적입니다.
    • 쿠키에 세션식별자를 저장하는 경우, 식별자로 클라이언트를 유추하거나 특정할 수 없게해야만 안전합니다. 그리고 중복되지 않아야만 합니다.
    • 정리하면 세션식별자는 클라이언트에, 쿠키에해당하는 내용은 서버에 저장하는것이 세션입니다.

    첨언

    쿠키/세션의 목적

    • 연결이 지속적이지 않은 HTTP 환경에서, 이전 연결에서 발생한 결과를 다음 연결에서 사용하기 위한 방법으로 고안된 것입니다.
    • 예를 들면
      • 이전 연결에서 요청한 어떤 계산 결과를 다음 요청해서 사용해야 한다거나,
      • "오늘 하루동안 팝업 열지 않기"를 눌렀는데, 서버에서 이를 인식하고 다음 연결에서 팝업되지 않게 하려고 할 때가 되겠습니다.
      • 마지막에 검색했던 검색어를 입력창에 유지하려고 하는 경우 등

    용용: 쿠키를 이용한 클라이언트의 식별

    • 쿠키를 이용해서 클라이언트를 식별할 수 있는 것이지, 쿠키가 클라이언트를 식별해주는 것은 아닙니다.
    • 즉, 아래 그림에서 "식별정보"라는 말이 잘못된 것이라고 보면됩니다.

    쿠키를 사용하여 클라이언트를 식별하는 방법의 한 예로는

    • 사용자ID, 로그인시간, IP등을 암호화한 구문을 클라이언트의 쿠키에 키이름=암호화된구문으로 저장합니다. (예: state=ASKHDNxxu7432keedsa7jhklsadasdmslk )
    • 위 쿠키는 서버에서 생성하여 클라이언트에게 쿠키에 저장하라고 응답합니다.(응답헤더)
    • 이제 클라이언트는 매번 서버에 요청할 때 위 쿠키를 전달합니다.
    • 서버는 로그인상황을 검사하기 위해서 매번 쿠키를 읽습니다. 그리고 위의 키를 찾아, 정보를 해독하고, 서버에 있는 사용자 정보와 비교하여, 일치하면, 로그인된 것으로 보고, 일치하지 않으면, 불량요청 혹은 로그인하지 않은 사용자로 판별하면 됩니다.

    응용: 세션을 이용한 클라이언트의 식별

    • 세션도 쿠키와 동일하게 세션을 이용해서 클라리언트를 식별할 수 있는 것입니다. 세션이 클라이언트를 식별해주는 것은 아닙니다.

    • 로그인 요청이 들어왔을 때, 로그인정보가 일치하면, 서버는 세션을 생성합니다.

    • 세션에는 사용자ID, 로그인시간, IP 등을 저장합니다.

    • 클라이언트에 응답할 때, 세션을 찾을 수 있는 세션ID를 클라이언트에 전달합니다.(보통 쿠키로 전달)

    • 클라이언트는 다음 요청시, 세션ID를 함께 요청(쿠키를 사용하든 다른 방법을 사용하든)합니다.

    • 서버는 이 세션ID를 이용해서 서버에 저장된 세션을 찾아옵니다.

    • 서버 애플리케이션은 이 세션에 저장된 정보를 읽어, 누가 로그인했는지 확인할 수 있습니다.

    • 세션에서 세션에 저장하는 것과 클라이언트에 저장하는 식별정보는 같은 값이 아닌것인가요? 알 수 없는 사용자 2016.11.16 15:06
    • 보통 웹서버 측에서 세션에 저장하면, 세션의 식별자를 생성하고, 이를 클라이언트에 알려주는데, 이 때 전달하는 방법을 쿠키로 전달합니다. 클라이언트는 서버에서 전달받은 세션 식별자를 향후 요청할 때마다 (쿠키 동작 메커니즘에 따라)전달하게 됩니다. 서버는 클라이언트가 보낸 세션 식별자를 보고, 해당 요청의 세션식별자를 이용하여 서버에 저장되어 있는 세션을 찾아 사용하게 됩니다. 허대영(소프트웨어융합대학) 2016.11.16 17:54
    • 그렇군요... 그렇다면 어차피 세션으로 해도 http를 통해서 세션ID를 주고 받는데 위험성은 쿠키나 세션이나 똑같은 것 아닌가요? 알 수 없는 사용자 2016.11.16 18:17
    • 답변에다가 제가 이해한 쿠키 동작과정과 세션 동작과정을 그림으로 표현해보았는데 혹시 이 과정이 맞는지 판별 부탁드려도 될까요? ㅠ 알 수 없는 사용자 2016.11.16 18:18
    • 쿠키와 세션을 비교할 때, 식별정보를 구분할 필요가 있을 것 같습니다. 쿠키에서 식별정보라고 쓴 부분에 저장하려는 데이터셋, 즉 {키,쌍}으로 구성된 정보입니다. 즉 세션에서 말하는 식별자하고 다른 정보입니다. 세션에서 말하는 식별자는 ID값으로 이전 연결과 현재 연결이 지속적임을 의미하는 값을 말합니다. 쿠키는 애플리케이션에서 저장하려고 하는 정보 {키,값}쌍들이 클라이언트에 저장되어 있는 것이고, 세션은 이 정보가 서버에 저장되어 있습니다. 그리고 위험성은 쿠키보다 세션이 안전합니다만, 세션ID만 보고, 클라이언트 특정할 수 있게 되면, 하이재킹이 가능함으로 쿠키와 마찬가지로 위험합니다. 그래서 세션의 경우, 충분히 긴 식별자로 사용하고, ID자체는 의미없는 값으로 구성되어야합니다. 허대영(소프트웨어융합대학) 2016.11.16 18:29
    • 아래 그림에서 쿠키는 모든 요청과 응답에 쿠키를 통해 데이터셋<키,쌍>이 교환되도록 수정하면 되며, 세션같은 경우는 세션ID만 교환하고, 데이터셋<키,쌍>이 서버에만 있으며, 서버는 여러 클라이언트를 위해 저장한 여러개의 데이터셋 중 하나를 찾아야 하는데, 이때 클라이언트가 전달한 세션ID를 사용해서 찾습니다. 허대영(소프트웨어융합대학) 2016.11.16 18:35
    • 정말 정말.. 귀찮게 해드려서 죄송합니다... 그림을 다시 한번 정리하여 새로운 답변에 달아보았습니다. 혹시 시간이 괜찮으시다면 이번에도 부탁드립니다.. ㅠ 페이스북 생활 코딩 그룹에도 올려보긴 했는데 페이스북의 성격상 훅훅 지나가다 보니 많은 분들이 보지는 못하는 것 같아서 답이 잘 안달려서 여기에 계속 올리게 되네요.. 죄송합니다..ㅠ 알 수 없는 사용자 2016.11.16 23:27
    • 헐 추가 첨언까지.. 감사합니다!! 알 수 없는 사용자 2016.11.17 00:04
  • 쿠키 동작과정

    이미지

    세선 동작과정 이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 쿠키를 이용했을 때 동작과정입니다. 이미지

    세션을 이용했을 때 동작과정입니다. 이미지

    아래의 그림은 각각의 방법을 이용했을 때 저장소에 저장되는 것들과 깊이?를 구분해보았습니다. 색깔의 구분은 깊이?를 구분한 것입니다.

    쿠키를 이용했을 때는 [클라이언트 측 식별 정보]와 [서버 측 식별 정보] 가 저장되는 깊이(레벨...?)가 다르다고 판단되어 다른 색으로 표현하였고

    세션을 이용했을 때는 [클라이언트 측 세션 ID]와 [서버 측 세션 ID]가 같은 깊이(레벨)라고 판단되어서 같은 색으로 표현했습니다!

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 클라이언트 식별에 대한 오해가 있는 것 같네요. 쿠키/세션은 클라이언트를 식별하는 것이 아니라, 이전 연결에서 생성한 정보를 다음 연결에서 사용할 수 있는 테크닉입니다. 이를 응용해서 클라이언트를 식별하는 것입니다. 관련내용을 답변에 첨언하였습니다. 허대영(소프트웨어융합대학) 2016.11.17 00:00
    • 프로세스는 그림으로 표현해주신것처럼 이해하면 됩니다. 허대영(소프트웨어융합대학) 2016.11.17 00:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)