JWT는 왜 사용할까

이정우·2022년 12월 1일
0

API만들기 과제를 계속해서 하던중 로그인 세션을 구현하기 위해서 이제 JWT를 이용해서 인증,인가를 구현해야 했다.
나는 JWT를 들어보기는 했지만, 실제로 사용하는건 이번이 처음이었다.
대충 어떤 느낌으로 사용하는지는 알았지만, 왜 사용하는지는 몰랐다.

세션 대신 JWT를 사용하는지 이유를 알고 싶었다.

그러기위해서는 세션을 이용한 인증 방식과 JWT를 이용한 인증 방식의 차이점을 알아야 했다.

Session


사용자가 정보를 주면, 서버에서 해당 인증 정보를 세션 저장소에 저장을 한 뒤
해당 세션을 식별할 수 있는 session id를 사용자에게 주게되고,
이후의 통신부터는 cookie에서 부터 session id를 전송해주게 된다.
전송이 되면, 세션 저장소에서 비교후 해당 id에 속하는 사용자를 식별하는 식으로 진행된다.

장점

  • 보안이 좋다. 해커가 session id를 탈취한다고 해도 서버에서 id를 삭제해버리면, 접근이 불가능하다.
  • 데이터 사이즈가 토큰보다 작아서 통신에 부담이 더 적다.

단점

  • 서버에 세션을 저장하고 사용하기때문에 사용자가 점점 늘어날수록 서버에 부담이 가기 시작한다.
  • 서버의 확장성 또한 토큰에 비해 제한적이다.
    사용자가 많아져 서버를 scale out 방식으로 늘리면, 각각의 서버에 동일한 세션 스토리지를 계속해서 넣지 않는 이상, 인증/인가가 너무 힘들어진다.

JWT

token을 이용한 인증은 사용자가 정보를 서버에 보내면, 서버는 그 사용자 정보를 확인뒤, JWT의 payload 부분에 식별은 가능하지만, 개인적인 정보는 아닌 (ex: table의 pk)
정보를 넣은후 서버에서 보유하고 있는 secret key를 통해서 암호화를 진행한 값을
access token으로써 사용자에게 전해준다.
그후에 통신들에서는 브라우저에 저장되어있는 token을 매 통신마다 request headers에 추가한 후 통신을 보내게 되고,
서버에서는 가지고 있는 secret key를 이용해 token을 decode하고 사용자를 식별하게 되는 형식이다.

장점

  • 확장성이 좋다.
    사용자의 정보를 서버에 저장하지 않고, 클라이언트가 저장하는 방식이기 때문에
    서버에 부담이 적다.
  • 브라우저 뿐만 아니라, 모바일에서도 사용 가능하다.
  • 사용자 수가 많아졌을때 scale out을 쉽게 할 수 있다.

단점

  • 서버에서 저장을 안하기 때문에, 특정 상황에서 사용자를 강제로 제지하는것이 어렵습니다.
  • session id보다 데이터가 훨씬 커서 통신에 훨씬 부담이 간다.

JWT와 session의 장단점을 정리를 하면서 들었던 생각은 확실히 처음 초기 스타트업 이나 규모가 작은 웹에서는 JWT가 좋겠다는 생각이 들었다.

그렇게 생각한 이유로는 2가지가 있다.

서버의 상태유지

세션의 경우에는 서버의 상태를 유지하게 되기때문에,
계속해서 서버에 부담이 token에 비해 더 될수밖에 없고,
서버의 비용 또한 훨씬 더 많이 들것이라고 생각했다.

확장성

내가 생각했을때 token과 세션중 token이 제일 강력하게 어필할 수 있는 장점은
확장성 이라고 생각한다. 세션같은 경우 확장성이 token에 비해 확실히 제한적이다.
특히 나중에 웹 사용자가 늘어나면 scale out을 해야되는데, 세션의 경우 scale out 과정이 훨씬 힘들다.
반면에 token은 확장하는것에 있어서 아무 걱정할 필요가 없다. 그냥 늘 하듯이 token을 발급해주고, 발급한 token을 통해 인가를 하면 된다.

JWT가 많이 쓰이는 결정적인 이유

내가 생각했을때 빅테크던 초기 스타트업이든 token을 많이 사용하는 이유는 확장성이 제일 크다고 생각한다.
scale out의 장점도 있겠지만, 여기서 말할 확장성은 연동에 대해서 말하고 싶다.
요즘은 웹하나가 다양한 서비스를 지원하고 하나의 회사에서 여러 서비스가 진행되고 있는 시점인데, 각각의 서비스를 이용할때 마다 매번 인증/인가 과정을 거치는것은 너무 귀찮고 번거로운 일이다.
이 번거로운 작업을 한방에 해결해줄수 있는게 token이라고 생각하기에 많은 웹에서 토큰을 사용한다고 생각한다.

0개의 댓글