JWT는 토큰 기반 인증 시스템의 구현체입니다.
그렇다면 토큰 기반 인증은 무엇이고 왜 사용하게 되었을까요?
서버 기반 인증
기존의 인증 시스템에서는 유저들의 정보를 기억하고 있어야 했습니다.
서버 상에 존재하는 세션 저장소를 읽어 인증을 유지하도록 했습니다.
이러한 서버 기반 인증에는 문제점이 존재했습니다.
-
세션
유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 해야 합니다. 대부분에는 메모리에 저장을 하는데 로그인 중인 유저의 수가 늘어난다면 서버의 램이 과부하가 될 수 있습니다. 이러한 방식을 피하기 위해 데이터 베이스에 저장을 한다면 데이터 베이스 성능에 무리를 줄 수 있습니다.
-
확장성
세션을 사용하면 서버를 확장하는 것이 어려워집니다. 여기서 서버의 확장이란 서버의 사양을 업그레이드하는 것이 아니라 더 많은 트래픽을 감당하기 위하여 여러 개의 프로세스를 돌리거나, 여러 대의 서버를 추가하는 것을 의미합니다.
세션을 사용하면서 분산된 시스템을 설계하는 것은 과정이 매우 복잡합니다.
-
CORS
세션은 기본적으로 쿠키값을 키로 사용해 세션 저장소에 접근합니다. 이러한 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어있습니다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 상당히 복잡할 수 있습니다.
토큰 기반 인증은 현재 모던 웹서비스에서 많이 사용되고 있습니다.
토큰 기반 시스템은 stateless 합니다. 상태를 유지하지 않기 때문에 유저의 인증 정보를 저장하지 않습니다.
Stateless 서버는 클라이언트에게 요청을 받을 때마다 클라이언트의 상태를 지속적으로 유지하지 않고 들어오는 요청만으로만 작업을 처리합니다. 이렇게 상태가 없는 경우 클라이언트와 서버의 연결고리가 없기 때문에 서버의 확 작성이 높아집니다.
이와 반대로 Stateful서버는 요청을 받을 때마다 상태를 유지하고 유지한 정보를 가지고 서비스를 제공하는데 이용하게 되는데 세션을 사용하는 웹서버를 예로 들 수 있습니다. 사용자가 로그인을 하면 세션에 정보를 저장해 두고 서비스를 제공할 때 세션에 저장되어있는 데이터를 이용합니다. 이러한 세션은 서버 메모리에 담을 때도 있으며 데이터 베이스에 담을 수도 있습니다.
대략 적인 작동원리는 다음과 같습니다.
- 유저가 올바른 정보를 가지고 로그인을 합니다.
- 서버에서 해당 계정 정보를 검증합니다.
- 검증에 성공했다면 서버에서 유저에게 signed 토큰을 발급해줍니다.
- 클라이언트 측에서 전달받은 토큰을 저장해 두고 서버에 요청할 때마다 해당 토큰을 서버에 함께 전달합니다.
- 토큰 전달할 때 HTTP 요청 헤더에 토큰 값을 포함합니다.
- 서버는 토큰을 검증하고 요청에 응답합니다.
토큰을 사용할 시 장점
무상태이며 서버의 확장성이 존재하며 보안성과 로그인 정보가 사용되는 분야의 확장성을 가지고 있습니다.
여러 플랫폼 및 도메인에서도 토큰만 유효하다면 정상적으로 요청에 대한 응답이 처리될 것입니다.
응답에 Access-Control-Allow-Origin: 만 추가해주면 됩니다.
웹 표준 기반입니다.
토큰 기반 인증 시스템의 구현체인 JWT는 웹 표준인 RFC 7519에 등록이 되어있습니다.
따라서 여러 환경에서 지원이 되며 수많은 회사의 인프라스트럭쳐에 사용되고 있습니다.
'Spring|Spring-boot' 카테고리의 다른 글
[Spring] 의존 자동 주입 대상의 필수 유무설정 (0) | 2021.01.25 |
---|---|
JWT(2) (0) | 2020.08.18 |
회원가입을 위한 Spring security (0) | 2020.08.09 |
Gradle 멀티 모듈 (0) | 2020.08.06 |
Lombok (0) | 2020.08.03 |
댓글