본문 바로가기

Programming

[네트워크] 세션과 토큰에 관하여.. (feat. 쿠키) / Session, Token, Cookie, Network

네트워크의 토큰과 세션에 관하여..

면접에서 나온 질문인데, 분명 기술 질문 관련해서 정리하면서 몇번 읽었던 내용이었지만,
실제로 접하며 느낀 적이 없어서 그런가 깔끔하게 대답을 못해서 다시 정리한다.

세션과 토큰이 나온 배경

  • HTTP 의 stateless 특성 때문에, 로그인 등의 상태를 유지해야 하는 경우를 보완하기 위해 나옴.

세션이란?

  • 통신을 하기 위해서 서로 연결된 순간부터 통신을 마칠 때 까지의 기간
    • 즉, HTTP 세션이란 클라이언트가 웹서버에 연결된 순간부터 통신 종료 까지의 기간
  • 쿠키를 기반으로 동작한다. (여기서 쿠키는, 세션에 앞서 stateless 문제를 해결하기 위해 나왔다)
    • 보안 문제 등으로 세션 아이디만 쿠키에 넣어 왔다갔다 할 수 있도록 세션을 만들었다.
    • 쿠키만 있을 때에는 쿠키 자체에 로그인 정보 자체를 넣어서 보내기 때문에 탈취 당하면 문제가 됨
    • 그나마 세션을 적용하면 쿠키 안에 세션ID 등만 들어있기에, 탈취 당해도 시간이 지나면 세션 expired 등으로 보호를 할 수 있음.
  • 인증 성공 후 세션 관련 정보를 DB에 저장하여, 많아지면 부하가 생길 수 있고 확장성이 좋지 않다.

세션이 사용되는 방법

  • 클라이언트: 로그인한다 (request)
  • 서버: 로그인사용자를 검증, 유효하면 고유ID를 세션저장소에 저장 후 세션ID를 만들어서 반환 (response)
  • 클라이언트: 세션ID 저장 후, 이제 End point (인증 필요 요청) 접근 시에 쿠키에 세션ID를 넣어서 요청 (request)
  • 서버: 쿠키에서 세션ID를 확인하고 저장소(DB)에서 검증 후 요청에 대한 응답 반환 (response)

토큰이란?

  • 인증을 수행하는 방법 중 하나이다.
  • 세션기반은 서버의 메모리 또는 DB에 유지하여 서버에 부하가 발생할 수 있으나,
    토큰은 서버에서 검증만 하면 되기 때문에 서버 부담이 적고 확장성을 높였다.

토큰이 사용되는 방법

  • 클라이언트: 로그인한다 (request)
  • 서버: 로그인사용자를 검증, 유효하면 토큰을 발급한다 (response)
  • 클라이언트: 토큰을 저장하고, 이제 End point (인증 필요 요청) 접근 시에 토큰을 헤더에 담아서 요청 (request)
  • 서버: 토큰을 검증하고 요청에 응답 반환 (response)

세션과 토큰의 차이점은?

  • 토큰은 클라이언트 측에 저장이 되고, 세션은 서버의 메모리나 데이터베이스에 저장된다.
    • 위 이유 때문에 안정성은 -> 세션 > 토큰
  • 토큰 사이즈 > 세션 ID 사이즈
  • 세션의 경우 클러스터 / 분산서버 환경에서 요청이 나뉘는 경우 요청이 들어가는 서버에 따라서 상태가 변할 수 있다.
    • 따라서, 토큰을 사용하는 것이 일반적 (확장성이 좋다)