Session vs JWT

김민건·2021년 10월 17일
0

기술

목록 보기
1/19

Session이란?

Cookie는 일상생활에서도 종종 들을 수 있는 단어다. 간단히 말하자면 Client 측의 브라우저에 저장되는 일종의 '정보'인데, 이를 통해 어딘가에 요청을 보낼 때 Request Header에 자동으로 딸려서 전송된다. ( 물론, 설정에 따라 모든 쿠키가 전송되는 것은 아님! )

그렇다면 Session은 무엇이길래 Cookie와 같이 언급이 되는 걸까?

Cookie와 Session의 차이점은 여러가지 있지만, 그 중에서도 정보가 저장되는 위치에 근본적인 이유가 있다.

Cookie와 Session은 이 하나의 차이점으로 구분된다해도 과언이 아니다.

Session과 Cookie를 사용하는 곳은 서버에 저장되는 정보가 비교적 안전하기 때문에 인증관련 정보는 Session으로 보통 관리를 하는데, 그 외에는 서버에 과부하를 줄이기 위해 Cookie를 사용하는 편이다

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

쿠키와 세션을 사용하는 근본적인 이유에는 HTTP 프로토콜의 특징에 있다

→ HTTP 프로토콜은 connectionlessstateless 한 특성이 있다.

⇒ 그럼 쿠키는 그렇다쳐도... 세션 대신 DB를 통해 상태를 관리하면 되지 않을까? → 매번 갱신되고 삭제되는 정보를 DB로 관리하고, 자주 요구되는 정보를 매번 DB에 접근해서 얻어내기에는 과부하가 크다

⇒ 따라서 이러한 특성으로 인해 발생하는 문제점들을 해결하기 위해 정보를 저장 & 유지하기 위해 쿠키와 세션을 사용한다.

쿠키

주요 특징

  • 서버측에서 Response Header에 Set-Cookie 속성을 사용해서 클라이언트에 쿠키를 만들 수 있다
  • 쿠키는 사용자가 따로 Request에 담지 않아도, 자동으로 Request Header에 담겨서 서버에 전송된다
  • 쿠키는 클라이언트 측에 저장된다
  • 쿠키의 유효 시간이 정해지면, 브라우저가 종료되어도 유지된다

구성 요소

  • 키 : 구별자
  • 값 : 구별자에 해당하는 value
  • 유효시간 : 쿠키의 유지 시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 요청 경로

동작 방식

  1. 클라이언트가 서버에 request를 보냄
  2. 서버에서 쿠키를 생성
  3. HTTP 헤더에 Set-Cookie를 포함시켜서 response
  4. 브라우저가 종료되어도 쿠키 만료 기간이 있으면, 클라이언트에서 보관
  5. 해당 도메인 혹은 경로로 요청을 할 때, HTTP 헤더에 쿠키를 담아서 request 전송
  6. 서버에서 쿠키를 읽고, 이전 상태를 변경할 필요가 있을 경우, 쿠키를 업데이트하여 변경된 쿠키를 Set-Cookie로 포함해서 response

세션

  • 세션은 서버 측에 저장된다
  • 서버는 클라이언트를 구분하기 위해 세션 ID를 부여해서 브라우저가 종료될 때까지 인증 상태를 유지한다
  • 세션의 유효 시간이 정해지면, 브라우저 종료 혹은 시간 만료까지 유지된다
  • 보안 측면에서는 쿠키보다 좋지만, 서버 메모리를 차지한다

동작 방식

  1. 클라이언트가 서버에 request를 보냄
  2. 서버는 해당 클라이언트에게 세션 ID를 부여하고 Set-Cookie를 통해 쿠키를 생성
  3. 클라이언트는 서버에 request를 보낼 때, 해당 세션 ID를 포함해서 전송
  4. 서버는 세션 ID를 기반으로 세션에 있는 클라이언트 정보를 가져옴
  5. 해당 세션 정보로 request를 처리하고 response

JWT

JWT란?

사실 JWT 자체가 인증 방법이 아니라, Token 기반 인증 방법이지만, 일반적으로 이에 JWT를 사용하여 이렇게 불린다

( 개인적으로 JWT보다 단순히 Token 기반 인증이라고 생각하면 이해가 좀 더 편한 것 같다 )

JWT와 Session의 가장 큰 차이점은 정보가 서버에 저장되는 것이 아니라 클라이언트가 저장하고 있다는 것이다

→ 하지만 이를 서버에서 암호화시켜서 클라이언트에게 전송해주고, 받을 때는 복호화하여 인증하기 때문에 보안을 유지할 수 있는 것이다

동작방식

  1. 클라이언트가 서버에 Request를 보냄
  2. 서버는 해당 클라이언트의 인증 정보와 암호키를 기반으로 암호화시켜 token을 발급함
  3. 발급된 토큰을 클라이언트에게 전송 ( Set-Cookie도 가능 )
  4. 클라이언트는 저장하고 있다가 Header에 포함시켜 보냄
  5. 서버는 매 요청마다 Header에 포함된 token을 복호화하여 검증하고 유저에게 권한을 부여함

JWT와 Session 비교

JWT

장점

  • 클라이언트에 저장되기 때문에, 서버 메모리에 부담되지 않는다
  • Session 사용할 때의 Scale Out 관련 에러사항이 발생하지 않는다
  • 멀티 디바이스 환경에 대한 부담이 없다

단점

  • XSS 공격에 취약하다
  • 상대적으로 손상의 위험이 크다

Session

장점

  • 구현이 간편하고 명확하다
  • 서버에서 로그인 상태 확인이 편하다
  • 상대적으로 안전하다

단점

  • 서버 메모리에 부담이 된다
  • Scale Out시, Session 정보를 어떻게 통일시킬 것인지 이슈가 발생한다
  • 멀티 디바이스 환경에 대한 부담이 생긴다

따라서 현재 진행하고자 하는 프로젝트에서 MSA 환경을 최종적인 목표로 하는 만큼, JWT를 사용하여 이와 관련된 이슈 문제점을 미연에 방지하고자 한다

profile
백엔드 꿈나무

0개의 댓글