세션vs쿠키vs토큰

박준수·2022년 11월 9일
0

세션

서버측에서 관리하는 사용자 정보

  • 서버와 클라이언트의 연결이 활성화 된 상태로 클라이언트가 서버에 접속하면 클라이언트 정보를 서버 단에 저장하게 된다.
  • 세션 ID를 발급해서 사용자를 구분한다.

쿠키

클라이언트측에서 관리하는 사용자 정보

  • 키와 값으로 구성된 사용자 정보 파일이다.
  • 유효시간을 명시해 줄 수 있다.
  • 클라이언트의 상태정보를 저장하고 참조할 수 있다.(HTTP의 무상태를 커버할 수 있다.)

세션과 쿠키 사용하는 이유

기본적으로 HTTP 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에
connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징
stateless : 통신이 끝나면 상태를 유지하지 않는 특징

예를 들어, 쿠키와 세션을 사용하지 않으면 쇼핑몰에서 옷을 구매하려고 로그인을 했음에도, 페이지를 이동할 때 마다 계속 로그인을 해야 합니다. 쿠키와 세션을 사용했을 경우, 한 번 로그인을 하면 어떠한 방식에 의해서 그 사용자에 대한 인증을 유지하게 됩니다.

세션 & 쿠키 인증 방식

  1. 사용자가 로그인 요청을 한다.
  2. 회원가입된 사용자일 경우) 유일한 세션ID를 생성하고, 사용자의 ID 및 사용자 정보를 세션 ID에 연결지어준다.
  3. 클라이언트가 세션 ID를 쿠키에 저장하도록 전달해준다.
  4. 클라이언트는 발급받은 세션 ID를 쿠키에 저장하고, 인증이 필요한 요청 때 마다 헤더에 쿠키를 실어 보낸다.
  5. 서버는 쿠키에 있는 세션ID를 이용해서 사용자 정보르 가져와서 인증을 한다.
  6. 인증이 완료되면 원하는 응답을 보내준다.

서버는 세션 Id를 저장하기 위한 세션 저장소가 필요하고, 일반적으로는 Redis를 많이 사용한다.

세션 & 쿠키 인증 방식의 단점

  • 서버가 세션을 저장하고 관리해야 된다는 단점이 있다.
  • 사용자의 수 만큼 세션을 발급해야되고 사용자 별로 세션 ID가 관리되므로 멀티 디바이스에 대한 고려가 필요하다.
  • 쿠키를 탈취당해서 해당 쿠키로 요청을 보내도 알 수 가없다. 방어를 https로 헤더를 암호화하고 쿠키의 시간을 짧게하는 방법이 있다.

이러한 단점 때문에 Json Web Token의 토큰 기반 인증 방식이 선호되고 있다.(세션&쿠키 인증방식은 서버 기반 인증 방식)

Json Web Token

Jwt는 Claim(권한)이라는 정보를 디지털 서명을 하고 비밀키로 조작 여부 등을 판단하여 검증하는 방식이다.

  • 전자 서명된 URL-safe(URL로 이용할 수 잇는 문자로만 구성된)의 JSON
  • 세션 아이디 대신에 토큰을 사용함으로서 서버측 부하를 낮추고 능률적인 접근 권한 관리가 가능하다.
  • 최초의 인증은 사용자 로그인을 통해서 이뤄지고 이때 토큰이 생성된다. 해당 토큰에는 사용자 PK, 권한 등이 들어간다.

JWT 구조

Header
토큰의 유형을 나타내는 정보가 들어있다.

  • 토큰의 타이과 해시 암호화 알고리즘

payload
Jwt의 내용으로 토큰에 담을 Claim 정보를 포함하고 있다. 클레임은 여러개 들어갈 수 있고 토큰 생성자의 정보(클라이언트 구분 값), 토큰생성시간, 만료 시간 등의 값이 들어간다.

Signature
header와 payload를 합친 문자열을 서명한 값이다.

이때 위의 header와 payload는 인코딩만 할 뿐 암호화 되지 않는다. 따라서 JWT의 헤더와 페이로드는 누구든 해시 알고리즘을 통해 디코딩하면 값을 볼 수가 있다. 따라서 토큰에는 사용자를 구분할 수 있는 값만 넣어야지 비밀번호나 사용자를 특정할 수 있는 개인정보를 담아서는 안된다.

토큰 기반 인증의 장점

  • 세션/쿠키 방식과 다르게 토큰을 따로 저장하거나 관리할 필요가 없다. 로그인 시 토큰을 발급해주고 요청이 올때 같이 토큰을 받아서 해당 토큰을 검증하고, 토큰에 들어있는 유저pk와 권한을 통해 확인해주면 된다.
  • 이러한 방식은 무상태 서버를 만들때 큰 장점이다. 상태를 저장하지 않아도 되므로 서버를 확장 / 유지/ 보수 할 때 유리하다.
  • OAuth2의 토큰 기반 인증 방식을 사용할 수 있다. 따로 회원가입/로그인을 위한 로직을 구현하지 않고 OAuth2를 이용해서 토큰 기반으로 인증하는 구글 로그인, 카카오톡 로그인 등을 사용할 수 있다.

토큰 기반 인증의 단점

  • 한번 발급된 토큰은 값을 변경할 수 가 없다.
  • payload는 공개값이므로 정보가 제한적이다. 개인정보가 포함되지 않거나 암호화해서 넣어야한다.
  • JWT의 길이가 매우 김으로 인증요청이 매우 많아지면 데이터 트래픽의 부하가 올 수 있다.
  • 토큰이 탈취당하면 만료되기 전까지 마음놓고 해킹할수가 있다.

참고 : 토큰인증방식/쿠키와 세션

profile
방구석개발자

0개의 댓글