Published on

cookie와 session

쿠키, 세션의 등장배경

  • 쿠키와 세션은 http의 특징인 비연결지향(Connectionless), 상태정보 비유지(Stateless)를 보완하기 위해 등장하게 되었다. http는 앞선 특징 때문에 클라이언트와 서버가 통신이 끝난 후에는 클라이언트의 상태를 가지고 있지 않는다. 하지만, 실제 서비스에서는 로그인 유지, 상품 구매 상태 등 클라이언트의 상태가 필요한 경우가 있다. 이때, 쿠키와 세션을 사용한다.
http의 특징.
 - 비연결지향(Connectionless): 클라이언트가 서버와 통신 후 보안을 위해 연결을 끊는 처리 방식.
    - http 1.1 버전에서 연결을 유지하고 재활용하는 기능이 default 되었으며, keep-alive 속성으로 설정 가능.
 - 상태정보 비유지(Stateless): 서버가 클라이언트의 상태 정보를 가지지 않는 방식
    - 서버의 자원을 크게 절약 가능.

쿠키(cookie)

  • 사용자 컴퓨터에 저장하는 기록 파일로 서버의 자원을 사용하지 않음.

  • 세션 관리 / 개인화 / 트래킹의 용도로 사용.

    • 세션 관리: 로그인, 사용자 닉네임, 접속 시간, 장바구니 등의 서버가 알아야할 정보들을 로컬에 저장.
    • 개인화: 사용자마다 다르게 적절한 페이지를 보여줄 때 사용.
    • 트래킹: 사용자의 행동과 패턴을 분석하고 기록.
  • key-value 형태의 데이터 포맷으로 이름, 값, 만료일, 경로 정보 등의 속성을 가짐.

  • 도메인 당 갯수 제한이 있음.

  • 현재는 서버에 요청시 함께 전송되어야할 데이터 / 상태를 관리하는 용도로 주로 사용 됨.

    • 쿠키가 과거엔 상태 데이터를 클라이언트에 저장하는 유일한 방법이었다. 하지만, 지금은 Web Storage API(localStorage, sessionStorage)로 대체 가능하고, 쿠키는 api와 함께 전송되기 때문에 클라이언트에서만 사용하는 상태 데이터는 쿠키에 담는걸 지양하는 것이 좋다.
  • 쿠키의 종류

    쿠키 종류특징
    세션 쿠키메모리에 저장. 브라우저 종료 시 쿠키를 삭제.
    영속성 쿠키만료시간(Expire Date or Max-Age)를 설정하고 장기간 유지되는 쿠키. 파일로 저장되며 브라우저 종료와 관계없이 사용 가능.
    보안 쿠키https 프로토콜에서 사용. 암호화되어 전송됨. XSS(cross-site scripting) 공격을 방지하기 위해 사용. HttpOnly 설정을 통해 document api로 수정을 제한.
    • // 보안 쿠키 예제.
        Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
      
  • 단점

    • 클라이언트가 쿠키 값을 임의로 수정 가능하기 때문에 위변조 위험이 존재한다. 따라서 보안상 취약하다.

세션(session)

  • 클라이언트의 상태를 서버측에서 유지하는 기술.
  • 서버에서 관리 된다는 측면에서 쿠키보다 보안적으로 유리.
  • 보안적으로 중요한 정보들을 서버 안에서 다루기 위한 용도로 사용.
  • 쿠키와 달리 용량에 제한이 없음.(서버 용량 허용 범위내)
  • 단점.
    • 서벙에 데이터를 유지하므로 트래픽이 몰릴땐 부하 발생 가능성이 있음.
    • 쿠키에 비해 비교적 속도가 느림.

쿠키 vs 세션 비교

cookiesession
저장 위치클라이언트의 브라우저가 지정하는 저장소서버의 메모리
저장 형식textobject
만료 시점쿠키 저장시 expire or Max-Age 설정(비설정시 브라우저 종료가 삭제 시점)클라이언트가 로그아웃하거나 설정 시간 동안 반응이 없으면 무효화되어 정확한 시점 알 수 없음
리소스클라이언트의 리소스서버의 리소스
용량 제한도메인당 갯수 제한 존재하며 한 쿠키 당 4KB의 용량 제한제한 없음(서버 용량 허용 범위 내)
속도메모리에 정보가 있어 비교적 빠름정보가 서버 또는 DB에 있어 비교적 느림
  • 자원관리와 보안 두 가지 측면을 고려하여 적절한 요소 및 기능에 병행 상용 하는 것이 중요

쿠키, 세션 로그인 인증 방식 사용예시

쿠키, 세션 로그인 인증 방식
  1. (클라이언트) 서버에 세션id와 로그인 정보로 로그인 요청.
// request body
{
    session_id: 'DFJSIOFJSD',
    id: 'huun',
    pw: 'huun1234'
}
  1. (서버) 로그인 성공시, 클라이언트에서 전달 받은 세션id와 로그인 정보를 기록.
  2. (서버) 클라이언트에게 로그인 결과 응답.
  3. (클라이언트) 로그인 성공시, 세션id를 쿠키에 저장.
  4. (클라이언트) 이후 사이트에서 사용자 인증이 필요한 작업(글쓰기 등) 수행시, 세션 id를 함께 서버에 전달.
  5. (서버) 세션 id를 통해 요청한 수행 권한 결과 응답.
  6. (클라이언트) 요청 권한 확인 후 서비스(글쓰기 등) 수행.

번외. 쿠키 & 세션은 캐시(cache)와는 다르다!

  • 저장 형식과 라이프사이클 차이가 주요점.
  • 쿠키 / 세션
    • 정보를 저장하기 위한 용도로 사용자의 인증에 주로 사용.
    • text, object 형식의 데이터.
    • 만료기간에 따른 자동 삭제.
  • 캐시
    • 웹 페이지의 빠른 렌더링을 목적으로 사용.
    • 웹 페이지의 리소스(image, css, js, media 등 다양)를 저장하기 위한 임시 저장소.
    • 클라이언트에서 주기적으로 캐시를 비워주거나, 서버에서 클라이언트로 응답을 보낼 때 header에 캐시 만료시간을 명시하는 작업이 필요.
      • 사이트가 캐시에 저장되면 해당 캐시 정보를 우선적으로 읽어오기 때문에 서버에서 사이트가 변경되어도 변경전 화면이 보일 수 있음.

ref