Study

세션기반 인증과 토큰기반 인증

짱이08 2023. 12. 19. 19:28

 

웹 개발에서는 HTTP 통신을 빼 놓을수 없다

HTTP 통신은 Stateless 하다는 특징이 있는데, 이는 상태를 가지지 않고 요청과 응답으로 처리하는 것이다.

 

그러면 상태를 가지지 않는다는 뜻은 무엇일까?

 

상태를 가지지 않는 다는 것은 각각의 요청에 독립적이라는 뜻이다.

즉, 내가 이전에 했던 요청이나 정보를 기억하지 않는 것이다.

 

그렇다면 내가 이전에 했던 요청이나 정보를 기억해야 하는 상황에서는 어떻게 해야 할까?

예를 들어, 로그인 상태를 저장한다던지, 아니면 이전에 입력한 정보를 불러오는 상황말이다.

 

이때 등장하는 것이 바로 쿠키와 세션이다.

 

보통 인증과 인가에서 쿠키와 세션이 등장하게 되는데, 

이전 회사에서 로그인한 사용자의 정보를 확인하기 위해

세션에서 가져온다는 말을 많이 썼고.. 당연히 나는 세션을 사용하는 줄 알았다..!

 

그런데 세션에 대해서 공부를 해보니, 이때까지 사용하던 방식은 토큰기반 인증 방식이라는 것을 알게 되었다….!?

생각해보니 회사에서 특정 서버를 담당하는 내 프로젝트에 세션관련 코드가 없다는 것을 기억해내게 되었다..

 

나의 무지에 반성하며, 세션기반 인증과 토큰기반 인증에 대해서 공부해보았다.

 

 

아까 말했듯이, HTTP 요청은 독립적이기 때문에 로그인 상태가 계속 되고 있다는 것을 서버가 인지해야 한다.

 

그 방법으로는 세션기반 인증 방식과 토큰기반 인증 방식이 있다.

 

세션기반 인증을 위해서는 세션과 쿠키가 필요하다.

세션기반 인증 시스템

출처: https://velog.io/@jun7867/%EC%84%B8%EC%84%A0-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EA%B3%BC-%ED%86%A0%ED%81%B0-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9DJWT-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

세션기반 인증 시스템에서는 해당 사용자가 로그인을 하면 서버에서 세션을 생성하여 response 객체에 세션ID를 함께 보내주게 된다.

그러면 웹브라우저는 쿠키에 해당 세션ID를 저장하고 데이터를 요청할 때 마다 헤더에 해당 세션ID를 보내주게 된다.

웹서버는 해당 쿠키를 검증하여 세션이 있다면, 세션을 획득하여 요청한 데이터를 보내주게 된다.

 

이렇게 하게 되면 아주 간단하게 로그인을 유지할 수 있는 장점이 있다.

 

그렇지만, 서버에서 클라이언트의 상태를 모두 알고 있어야 하기 때문에 메모리나 DB에 부하가 있을 수 있고, 

사용자가 많을 경우 서버를 확장하고 로드밸런싱을 해야 하는데 이때 세션의 관리가 어려워 진다.

 

로드밸런싱이란?

더보기

로드밸런서는 들어오는 클라이언트 요청을 여러 서버에 균등하게 분산시키는 역할을하는데,

세션 정보는 특정 서버의 메모리에 저장된다. 

이 경우, 사용자가 로그인하면 그들의 세션 정보는 그들을 처리한 특정 서버에만 존재하게 되기 때문에 불일치 문제가 일어날 수 있다.

토큰기반 인증 시스템

 

토큰기반 인증 시스템은 사용자들이 인증을 받게 되면 토큰을 발급하고, 서버에 요청을 할 때 토큰을 함 께 보내면 서버에서 유효성 검사를 하게 된다. 

 

여기서 토큰은 클라이언트의 인증 정보를 담은 데이터이다.

토큰은 사용자의 인증 정보, 사용자 권한, 토큰의 유효 기간 등을 암호화된 형태로 내장하고 있어.

서버는 추가적인 데이터베이스 조회 없이도 토큰만으로 사용자의 인증 상태를 확인할 수 있다는 장점이 있다.

 

즉, 더이상 사용자의 정보를 세션에 저장하지않고, 웹브라우저에 저장된 토큰 만으로 작업을 처리 할 수 있는 것이다.

 

하지만 클라이언트 측에서 정보를 저장하는 것이기 때문에 보안상의 문제를 완전히 피할 수는 없다.

암호화 되어 있다고 하더라도 암호화가 풀릴 가능성이 있고, 토큰 정보가 탈취 될 수도 있다.

 

 

요즘은 MSA와 다양한 플랫폼과의 호환성 으로 토큰기반 인증시스템을 많이 사용한다.

그렇지만 어떤 방식도 완벽하지 않기 때문에,
어떤 인증/인가 방식을 것인가는 어플리케이션의 규모와 특징 환경을 파악하여 적절히 적용하는 것이 좋다.