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

hyelim·2023년 6월 30일
1

인증이 필요한 요청을 보낼때 header에 Authorization 에 토큰을 보낼때 Bearer xxx의 형식으로 보내야한다
xxx의 형식으로 보내면 아예요청이 가지 않는다

포스트맨에서 관련 API를 테스트할때 이것을 설정하지 않아 꽤 시간을 낭비했던 경험이 있다

그러면 여기서 Bearer 의 의미는 무엇이고 왜 필요할까?
먼저 이에 대해 알아보기 위해 토큰 기반 인증이 무엇인지 정리하고 가자

토큰 기반 인증

토큰 기반 인증 전에는 서버 기반 인증을 사용하였다

세션 기반 인증은 아래와 같은 프로세스로 동작하는데

확장성의 문제와, 성능의 문제가 존재한다.

먼저 확장성의 경우 부터 알아보자

세션기반 인증의 확장성문제

세션을 사용하면 서버를 확장하는것이 어려워진다. 여기서 서버의 확장이란, 단순히 서버의 사양을 업그레이드 하는것이 아니라, 더 많은 트래픽을 감당하기 위하여 여러 개의 프로세스를 돌리거나, 여러대의 서버 컴퓨터를 추가 하는것을 의미한다. 그렇기에 세션을 사용하면서 분산된 시스템을 설계하는건 불가능한것은 아니지만 과정이 매우 복잡해진다

웹 어플리케이션에서 세션을 관리 할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어있다. 따라서 쿠키를 여러 도메인에서 관리하는것은 좀 번거롭다.

확장성 문제와도 연결지을 수 있을 것이다

세션기반 인증의 성능문제

유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 해야한다 이를 세션 이라고 부르는데

대부분의 경우엔 메모리에 이를 저장하는데, 로그인 중인 유저의 수가 늘어난다면 서버의 램이 과부화가 된다.

이를 피하기 위해서, 세션을 데이터베이스에 시스템에 저장하는 방식도 있지만, 이 또한 유저의 수가 많으면 데이터베이스의 성능에 무리를 줄 수 있다

이런 문제로 인해 토큰 기반 인증이 등장한 것이다

토큰 기반 시스템의 작동 원리

토큰 기반 시스템은 stateless 하다. 무상태. 즉 상태유지를 하지 않는다는 것이다

이 시스템에서는 더 이상 유저의 인증 정보를 서버나 세션에 담아두지 않는다. 이 개념 하나만으로도 위에서 서술한 서버에서 유저의 인증 정보를 서버측에 담아둠으로서 발생하는 많은 문제점들이 해소된다

세션이 존재하지 않으니, 유저들이 로그인 되어있는지 안되어있는지 신경도 쓰지 않으면서 서버를 손쉽게 확장 할 수 있다

토큰 기반 시스템의 구현 방식은 시스템마다 크고작은 차이가 있겠지만, 대략적으로 보면 다음과 같습니다:

  1. 유저가 아이디와 비밀번호로 로그인을 합니다
  2. 서버측에서 해당 계정정보를 검증합니다.
  3. 계정정보가 정확하다면, 서버측에서 유저에게 signed 토큰을 발급(ex. JWT) 해줍니다.여기서 signed 의 의미는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature 를 지니고 있다는 것입니다
  4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달합니다.
  5. 서버는 토큰을 검증하고, 요청에 응답합니다.

일반적으로 토큰을 서버에 전달 할 때에는, HTTP 요청의 헤더에 토큰값을 포함시켜서 전달한다

일반적으로 토큰은 요청 헤더의 Authorization 필드에 담아져 보내진다.

Authorization: <type> <credentials>

우리가 궁금해하던 bearer는 위 형식에서 type에 해당한다. 토큰에는 많은 종류가 있고 서버는 다양한 종류의 토큰을 처리하기 위해 전송받은 type에 따라 토큰을 다르게 처리한다

이제 이 포스팅의 목적인 헤더의 Authorization 설정에서 bearer이 무엇인지 살펴보자

인증 타입

Basic

사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용한다. (RFC 7617)

Bearer

JWT 혹은 OAuth에 대한 토큰을 사용한다. (RFC 6750)

Digest

서버에서 난수 데이터 문자열을 클라이언트에 보낸다. 클라이언트는 사용자 정보와 nonce를 포함하는 해시값을 사용하여 응답한다 (RFC 7616)

HOBA

전자 서명 기반 인증 (RFC 7486)

Mutual

암호를 이용한 클라이언트-서버 상호 인증

AWS4-HMAC-SHA256

AWS 전자 서명 기반 인증 (링크)

위 인증 타입의 종류에서 나타난 것 처럼, bearer는 JWT와 OAuth를 나타내는 인증 타입이다

profile
기록용

0개의 댓글