Today I Learned

[TIL] 토큰 기반과 세션 기반의 인증

mhko411 2021. 8. 11. 09:53
728x90

프로젝트를 진행하면서 사용자 인증을 위해 JWT 토큰 기반의 인증을 하였다. 하지만 JWT 토큰 기반은 제한시간을 설정해둘 수 있는데 배포 전에 테스트할 때는 굉장히 오랜 시간으로 설정을 해두었다. 하지만 실제 배포했을 때는 적당한 시간을 고려하여 JWT 토큰을 변경해줘야 하는데 이렇게 되면 서비스를 이용하다가 갑자기 로그아웃이 되는 이슈가 발생하지 않을까?라는 생각을 하였다. 

 

그리고 토큰 기반의 인증 이외에 어떠한 사용자 인증 방법이 있는지 알아봤고 세션 기반의 인증 방식도 있다는 것을 알 수 있었다. 이번에는 토큰 기반의 인증과 세션 기반의 인증의 차이점을 알아보고 각각의 인증 방식의 장점과 단점을 알아보기로 하였다.


먼저 인증 방법에 대해 알아보기 전에 HTTP의 특징을 간단하게 알면 좋을 것 같다. HTTP는 무연결성무상태성이라는 특징이 존재한다. 

무연결성은 서버와 클라이언트 사이를 연결하지 않는 것이며 클라이언트가 서버에 요청 후에 서버가 응답하면 연결을 끊어버린다. 계속해서 해당 연결을 지속하는 것이 아니다. 또한 무상태성은 서버와 클라이언트 사이의 세션(클라이언트와 웹 서버 간의 네트워크 연결이 유지되어 있는 상태) 정보를 서버에 저장하지 않는 것이며 세션 관리를 클라이언트가 책임지도록 하는 것이다.

 

그렇다면 어떤 웹 서비스를 로그인 후에 이용할 때는 해당 사용자가 로그인을 한 회원인지 아닌지 어떻게 알 수 있을까? 이때 우리는 토큰 기반의 인증 방식과 세션 기반의 인증 방식을 통해 정상적으로 로그인을 한 사용자가 서비스를 이용할 수 있도록 한다.


세션 기반 인증

세션 기반의 인증은 다음과 같은 과정을 통해 이루어진다.

1) 서버는 클라이언트에게 세션 ID를 부여한다.

2) 클라이언트는 쿠키에 세션 ID를 저장한다.

3) 서비스를 이용할 때 쿠키에 저장된 세션 ID를 사용하고 

4) 서버에 저장되어 있는 세션 ID를 통해 사용자가 회원이 맞는지 식별한다.

5) 이때 서버는 클라이언트가 보내온 세션 ID와 서버에 저장되어 있는 세션 ID를 비교한다.

 

세션 기반 인증을 사용하면 다음과 같은 장점이 존재한다.

  • 서버측에서 관리하기 때문에 손상될 우려가 적어 토큰 기반 인증 방식보다 안전하다.
  • 사용자가 로그인 상태가 맞는지 서버에서 확인하기 편하다.

세션 기반 인증의 단점은 다음과 같다.

  • 사용자들의 세션 정보를 서버에 저장하기 때문에 서버에 부담이 된다.
  • 멀티 디바이스 환경에서 로그인할 때 중복으로 처리되지 않도록 신경써줘야 한다.
  • 서버를 확장할 때 세션의 관리가 어려워진다.

 

토큰 기반 인증

토큰 기반의 인증은 다음과 같은 과정을 통해 이루어진다. 대부분의 웹 서버에서는 JWT를 사용한다.

1) 사용자가 로그인했을 때 JWT를 발급한다.

2) 클라이언트는 발급받은 JWT를 local storage에 저장한다. 

3) 클라이언트는 웹 서버에 요청을 보낼 때 Header에 토큰을 삽입한다.

4) 서버에서는 받은 요청들에서 Header의 토큰을 확인하여 사용자를 식별한다.

 

토큰 기반 인증의 장점은 다음과 같다.

  • 토큰을 클라이언트 측에서 관리하기 때문에 서버에 부담이 되지않는다.
  • 멀티 디바이스 환경 처리에 대해 신경을 상대적으로 덜 써도된다.

토큰 기반의 단점은 다음과 같다.

  • 클라이언트 측에서 관리하기 때문에 손상 위험이 있다.
  • XSS 공격에 취약하다.
  • 인증 시간이 완료되면 서비스 이용 중에 로그아웃이 될 수 있다. 이를 위해 인증 시간을 늘리면 위험 요소에 노출될 가능성이 높아진다.

이후에는 세션 기반의 인증을 구현해보고 토큰 기반의 방식과 직접적으로 비교해봐야겠다.