Tiny Finger Point Hand With Heart
본문 바로가기
1일1CS

30. 세션 기반 인증과 토큰(JWT) 기반 인증의 차이

by yoondii 2023. 1. 6.
728x90
반응형

둘의 차이를 알기 위해서는 인증과 인가가 무엇인지 알아야한다.

>인증 , Authentication

쉽게 말해서 로그인이라고 생각하면된다.

특정 서비스에 일정 권한이 주어진 사용자임을 아이디랑 패스워드 등을 통해서 말 그대로 인증을 받는것.

(잠깐,어센티케이션!)

 

>인가, Authorization

로그인으로 인증을 하고 나서 본인계정으로 만 사용가능한 여러 서비스를 사용할때 

내가 로그인 되어있음을 알아보고 허가해 주는 것.

즉, 로그인이 유지된 상태에서 일어나는 일.

(응~어서와이제이션)


세션과 토큰이 도입된 HTTP의 큰 문제

HTTP는 stateless한 특성을 가지기 때문에 각 통신의 상태는 저장되지 않는다.

하지만 우리가 웹 서비스를 사용할 때를 생각해보면,

매번 새 페이지를 요청할때마다 로그인을 해야 한다면 사용이 불가능할 것이다.

 

대신 기억하기 위해 사용되는 세션과 토큰

이 문제를 해결하기 위한 대표적인 도구 두 가지가 바로 세션(Session) 토큰(Token)이다.

 

유저가 로그인을 시도할 때 서버상에서 일치하는 유저 정보를 찾았다면 

인증(Authentication) 확인의 표시로 세션이나 토큰을 발급/전달해준다.

 

그럼 웹 브라우저 측에서 해당 세션/토큰 정보를 받아 간직하고 있다가

새로운 request를 보낼 때마다 인가(Authorization)를 위해 해당 세션/토큰을 함께 보낸다.

 

그런데 세션과 토큰 모두 존재 목적은 거의 같지만 차이점은 존재한다.

그 중 가장 큰 차이점은 세션은 데이터베이스 서버에 저장된다는 것,

토큰은 클라이언트 측에서만 저장한다는 점이다.


차이점 1. 사이즈

세션 < 토큰

세션을 사용시 주고받는 session id의 크기는 매우 작다.

반면 (JWT기준) 토큰은 같은 데이터를 담고 있어도 그에 비해 크기가 크다.

출처:  https://developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens


차이점 2. 안전성

세션

세션은 서버측에서 저장/관리하기 때문에 상대적으로 온전한 상태를 유지하기 유리하다.

하지만 여전히 공격의 위험이 있기에 유효기간, HttpOnly, Secure 옵션 등을 주어 쿠키에 저장한다.

 

토큰

반대로 토큰은 웹 브라우저측 (local storage, 혹은 쿠키 등)에 저장되기 때문에 공격에 노출될 가능성이 더 크다.

이런 경우를 대비해 토큰에는 민감한 정보를 담지 않다.

그리고 유효기간을 짧게 설정해 공격에 노출될 수 있는 시간을 최소화한다.

하지만 짧은 주기로 토큰이 무효화되면 서비스 사용자는 계속 로그인을 해줘야 하는 번거로움이 있기 때문에

애초에 로그인(인증)시 refresh token이라는 것을 추가적으로 발급한다.

 

refresh token은 좀 더 긴 유효기간을 가졌으며 최대한 안전한 곳에 저장된다.

기존의 토큰이 만료되거나 변질되면 refresh token을 통해 토큰을 재발급한다.

 


차이점 3. 확장성

최근 대부분의 웹 서비스가 토큰 방식을 선택하게 된 이유가 바로 확장성에 있다.

 

세션은 서버에 저장되기 때문에 한꺼번에 다중 접속자가 발생한다면 과부하가 걸릴 수 있다.

그럼 과부하를 덜어주기 위해 서버를 여러 대를 두면 되겠지만 또 서버가 여러대라면 세션을 쓰기가 복잡해진다.

 

서버 분산 / 클러스터 환경에서 드러나는 결정적인 차이

요즘 많은 서비스들은 서버 과부하 부담을 줄이기 위해 여러 서버를 두고 서비스를 운영한다.

그리고 앞서 언급했듯 HTTP는 stateless, connectionless 하기 때문에

request마다 내가 접속한 서버가 달라질 수도 있다.

 

이렇게 되어 버리면 session 정보가 없는 다른 서버에 접속할 때마다 계속 로그인해줘야 한다.

 

물론 이러한 세션의 단점을 해결하기 위해

sticky session, session clustering과 같은 방안이 나오기도 했다만 

또 이 방안들도 감안해야 할 처리 비용이 발생하기 때문에*

애초에 이런 걱정 없이 쓸 수 있는 토큰이 인기가 많은 게 아닌가 싶다.

 

 * sticky session은 처음 지정받은 서버만 사용할 수 있기 때문에

 해당 서버가 터지거나 과부하가 걸려도 방법이 없다.

 session clustering은 모든 서버마다 세션을 복사해줘야 하기 때문에

 상당한 메모리를 요구할 뿐 아니라 매 로그인마다 오버헤드가 크게 발생한다.

 

물론 세션용 서버를 따로 두고 쓰는 방법도 있다.

하지만 만일을 대비하여 서버를 복제해두어야 한다.

애초에 토큰방식을 사용한다면 추가 서버 없이 인증/인가를 처리할 수 있다.


세션과 토큰의 작동방식

세션
토큰

728x90
반응형

'1일1CS' 카테고리의 다른 글

32. 디자인패턴이란?  (0) 2023.01.09
31. 컴파일러란?  (0) 2023.01.06
29. JWT(JSON Web Token)  (0) 2023.01.06
28. GPU란  (0) 2023.01.05
27. IPv4 와 IPv6  (0) 2023.01.05

댓글