코드 그라데이션

[사전 지식] 토큰 기반 인증 본문

SpringBoot [예제] 블로그 만들기/시큐리티, JWT 입히기

[사전 지식] 토큰 기반 인증

완벽한 장면 2023. 10. 18. 10:52

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

앞 장인 스프링 시큐리티로 로그인/로그아웃회원가입 구현하기에서는

기본적으로 제공해주는 세션 기반 인증을 사용해 사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증을 한다.

이를 세션 기반 인증이라고 한다.

 

토큰 기반 인증은 토큰을 사용하는 방법이다.

 

토큰은 서버에서 클라이언트를 구분하기 위한 유일한 값인데

서버가 토큰을 생성해서 클라이언트에게 제공하면,

클라이언트는 이 토큰을 갖고 있다가 여러 요청을 이 토큰과 함께 신청한다.

그럼 서버는 토큰만 보고 유효한 사용자인지 검증한다

 

토큰을 전달하고 인증 받는 과정

토큰은 요청과 응답에 함께 보낸다.

 

[그림]

 

클라이언트가 아이디와 비밀번호를 서버에게 전달하면서 인증을 요청하면

서버는 아이디와 비밀번호를 확인해 유효한 사용자인지 검증한다. 유효한 사용자면 토큰을 생성해서 응답한다.

클라이언트는 서버에서 준 토큰을 저장한다.

이후 인증이 필요한 API를 사용할 때 토큰을 함께 보낸다.

그러면 서버는 토큰이 유효한지 검증한다.

토큰이 유효하다면 클라이언트가 요청한 내용을 처리한다.

 

 

토큰 기반 인증의 특징

대표적으로 세 가지 특징이 있다. 토큰 기반 인증은 무상태성확장성무결성이라는 특징이 있다.

 

무상태성

무상태성은 사용자의 인증 정보가 담겨 있는 토큰이 서버가 아닌 클라이언트에 있으므로 서버에 저장할 필요가 없다.

서버가 뭔가 데이터를 유지하고 있으려면 그만큼 자원을 소비해야 하니까.

 

그런데 토큰 기반 인증에서는 클라이언트에서 인증 정보가 담긴 토큰을 생성하고 인증한다.

따라서 클라이언트에서는 사용자의 인증 상태를 유지하면서 이후 요청을 처리해야 하는데

이것을 상태를 관리한다고 한다.

이렇게 하면 서버 입장에서는 클라이언트의 인증 정보를 저장하거나 유지하지 않아도 되기 때문

완전한 무상태(stateless)로 효율적인 검증을 할 수 있게 된다.

 

 

확장성

무상태성은 확장성에 영향을 준다. 서버를 확장할 때 상태 관리를 신경 쓸 필요가 없으니 서버 확장에도 용이한 것이다.

 

예를 들어보면, 물건을 파는 서비스가 있고결제를 위한 서버와 주문을 위한 서버가 분리되어 있다고 가정해보자. 세션 인증 기반은 각각 API에서 인증을 해야 되는 것과는 달리 토큰 기반 인증에서는 토큰을 가지는 주체는 서버가 아니라 클라이언트이기 때문에 가지고 있는 하나의 토큰으로 결제 서버와 주문 서버에게 요청을 보낼 수 있다.

추가로 페이스북 로그인구글 로그인 같이 토큰 기반 인증을 사용하는 다른 시스템에 접근해 로그인 방식을 확장할 수도 있고이를 활용해 다른 서비스에 권한을 공유할 수도 있다.

 

 

무결성

토큰 방식은 HMAChash'based message authentication 기법이라고도 부른다.

토큰을 발급한 이후에는 토큰 정보를 변경하는 행위는 할 수 없다. , 토큰의 무결성이 보장된다.

만약 누군가 토큰을 한 글자라도 변경하면 서버에서는 유효하지 않은 토큰이라고 판단하는 것이다.

 
728x90
Comments