SESSION vs JWT

진영민·2022년 10월 5일
1

잡다한 상식

목록 보기
6/22
post-custom-banner

서버는 보통 stateless하다. 사용자가 누구인지 기억하지 않으며, 때문에 사용자는 자신이 누구인지 알리는 정보를 보낸다. 주로 사용하는 방법이 쿠키를 통하는 방법이다.

서버는 현재 상태에 대한 데이터를 쿠키의 형태로 클라이언트에게 보낸다.
클라이언트는 이를 메모리나 디스크에 저장하며, 서버로 request를 보낼 때 마다 쿠키를 같이 전송한다.
서버는 이 쿠키를 해당 클라이언트의 상태를 기억하는데 사용하며 적절한 response를 만들어낸다.

session

세션은 다음이 보장되어야 한다.

  1. 기밀성 : 서버 이외의 어떤 것도 세션 데이터를 해석할 수 없어야 한다.
  2. 데이터 무결성 : 서버 이외의 어떤 것도 세션 데이터를 조작해서는 안된다.
  3. 보안 : 서버 이외의 어떤 것도 유효한 세션을 시작할 수 없어야 한다.

이를 위해 서버는 세션 데이터를 클라이언트에 보내기 전에 암호화한다.
또한 웹 브라우저는 웹 사이트에 저장될 수 있는 쿠키의 수와 크기를 제한하기 때문에 서버는 쿠키를 만들기 전에 데이터를 압축한다.

클라이언트가 웹사이트에 접속해 로그인한다.
서버는 회원 데이터베이스를 이용해 사용자를 확인한 후
세션 저장소(데이터베이스)에 회원 정보 세션을 생성한다.
생성한 세션의 Id를 클라이언트에게 보내준다.
클라이언트는 이 Id를 쿠키에 넣어 서버와 통신하며, 서버는 이 Id값으로 클라이언트가 누구인지 알 수 있다.
클라이언트가 접속을 종료하거나 로그아웃 하면 서버는 해당 세션Id를 제거한다.

쿠키만을 사용하는 것 보다 사용자 정보를 서버에 저장하기 때문에 보안상 안전하다.
하지만 결국 서버 데이터베이스에 저장하기 때문에 사용자가 많아지면 세션 확인이 느려지고 비용이 든다.

JWT

Json Web Token
session과 유사하게 사용자의 정보를 담고 있다. 하지만 session은 해당 정보를 서버에 저장하고, 이를 식별할 수 있는 정보를 클라이언트에게 전해주지만, JWT는 token안에 이를 식별할 수 있는 정보를 가지고 있다.

구조는 Cookie와 크게 다르지 않지만 서명된 토큰이라는 점이 다르다.
public key, private key를 사용하여 토큰에 서명할 경우 서버가 이 토큰이 정상적인 토큰인지 인증할 수 있다.

JWT는 3단계로 구성되어있다.
Header, Payload, Signature

  1. Header
    토큰의 타입이나 서명 생성에 어떤 알고리즘이 사용되었는지 저장한다.
  2. Payload
    사용자에 대한, 토큰에 대한 property를 key-value의 형태로 저장한다.
    표준 스펙으로는 key는 3글자로 되어 있다.
    1) iss(issuer):토큰 발급자
    2) sub(subject):토큰 제목
    3) aud(audience):토큰 대상자
    4) exp(Expiration time):토큰 만료 시간
    5) nbf(Not Before):토큰 활성 날짜
    6) iat(issue At):토큰 발급 시간
    7) jti(JWT Id):JWT 토큰 식별자
    주의할 점은 Header나 Payload에는 특별한 암호가 걸려있는 것이 아니기 때문에 민감한 정보를 담지 않는 것이 좋다.
  3. Signature
    signature는 서버에 있는 개인키로만 암호화를 풀 수 있다.

장점

이미 인증된 정보이기 때문에 인증 저장소가 필수적이지 않다.
클라이언트의 상태를 서버가 저장해 두지 않아도 된다.
signature를 암호화로 막아두었기 때문에 데이터에 대한 보완성이 늘어난다.

한계

토큰 안에 데이터를 저장하기 때문에 데이터 전달량이 많다.
토큰이 탈취당하면 만료될 때까지 대처가 불가능하다.

따라서 JWT는 만료 시간을 짧게 가져간다. 토큰이 탈취당해도 금방 만료가 되기 때문에 최소한의 보안성을 얻을 수 있다.
하지만 그만큼 사용자가 매번 로그인 해야 하는 상황이 발생한다.
이는 Sliding token이나 Refresh token으로 해결한다.

  1. Sliding token
    특정한 서비스를 사용하고 있는 유저에 대해 만료 시간을 연장시켜주는 방법이다. 사용자가 특정 행동을 했을 때 새롭게 만료시간을 늘린 JWT를 다시 제공하면서 만료시간을 연장하여 보완하는 방법이다.
  2. Refresh token
    JWT를 처음 발급할 때 Access Token과 함께 Refresh Token이라는 토큰을 발급하여 해결한다.
    Refresh Token은 Access Token을 새로 발급받을 수 있는 토큰이다. Access Token이 만료되면 Refresh Token을 이용하여 Access Token을 새로 발급받을 수 있다.

refresh token은 서버 데이터베이스에 저장한다.

profile
코린이
post-custom-banner

0개의 댓글