Spring Security, OAuth2.0 Client, JWT 로그인 구현하기 - 1
1. OAuth2.0 이란?
OAuth 2.0은 특정 사용자나 시스템이 자신의 자원에 접근할 수 있도록 제한된 권한을 제3의 애플리케이션에 부여하는 방식을 정의한 인증 및 권한 부여 프로토콜입니다.
말이 어렵죠 ? 간단한 상황을 예시로 들어보겠습니다.
A 라는 Client 가 제가 만들고 있는 출석부 서비스 체쿠리에 인증 요청을 할 때
인증을 체쿠리 서버에서 하는 것이 아니라
제3의 어플리케이션에게(ex. 카카오톡) 인증 대리를 맡기면
인증 완료 후 제3의 어플리케이션으로 부터 체쿠리 서버가 인증 정보를 받게 되는 시스템 입니다.
아래의 카카오톡에서 제공하는 카카오톡 OAuth2 인증 절차를 보시면 더 쉽게 이해가 되실 겁니다.
2. 카카오톡 OAuth2 과정
2-1. 용어 정리
이 인증 절차를 설명하기 전에 용어부터 정리를 하겠습니다.
- Service Client : 인증을 요청하는 사용자입니다.
- Service Server : 사용자의 인증 요청을 받는 개발하고 있는 서비스입니다. 저희는 체쿠리가 되겠네요
- Kakao Auth Server : 말 그대로 카카오 인증 서버입니다.
- ❗인가 코드 : 카카오 서버에 인증 토큰을 발급 받기 위한 인가 코드
- ❗토큰 : 카카오 서버에 회원 정보 요청, api 요청을 보내기 위한 토큰
( Service Server 에서 생성하는 토큰과는 다른 Kakao Server 의 토큰입니다. 이 부분에서 혼동하시는 분들이 많은데 Kakao Server 토큰입니다.
2-2. 과정 설명
그럼 이제 사진에 나와 있는 순서대로 설명을 해보겠습니다.
시나리오는 사용자가 서버에 카카오 로그인 요청을 보내면서 시작합니다.
1~5 번은 우리가 흔히 카카오톡 로그인을 누르면 카카오톡 로그인 창으로 넘어가서 로그인하고 인증하는 과정입니다.
이 과정이 끝나면 Kakao Server는 Service Server에 Kakao Server 에 토큰발급을 요청할 수 있는 인가코드를 발급합니다.
그러면 Service Server 는 이 인가코드를 기반으로 Kakao Server 에게 토큰을 요청합니다.
이 과정이 Step 2: 토큰 받기 (1) 번 과정이 되겠네요
인가 코드가 올바르다면 Kakao Server 는 토큰을 발급해 줍니다.
이 발급 받은 토큰으로 카카오 회원 정보를 조회하거나 Kakao API 를 호출하는데 사용됩니다.
2-3. 백엔드 개발자의 역할
가장 중요한 부분이겠죠 ?
위의 카카오에서 제공하는 사진을 보면 알 수 있듯이
처음에 사용자 요청이 오면 백엔드 서버는 Kakao 인증 서버를 Redirect 하는 역할을 합니다.
그 후에 카카오 로그인 인증 절차는 Client와 Kakao 인증 서버가 알아서 진행하는 것이죠
사진상 2~5번의 과정은 백엔드 개발자가 할 일이 없습니다.
6번 과정에서 전달 받은 인가코드를 이용해서
카카오 인증서버에 토큰을 요청하고
결과로 받은 카카오 인증서버 토큰을 이용해 사용자 정보를 조회하면 됩니다.
3. Spring OAuth2.0 Client 의 역할
3-1. 왜 Spring OAuth2.0 Client 를 사용할까?
모든 라이브러리는 개발자가 불필요한 코드를 작성하지 않도록 도와주고
어려운 과정을 추상화 해준다.
그러면 OAuth2.0 Client 라이브러리는 위에서 설명한 과정 중 어떤 과정을 추상화 해줄까 ?
정답은 Step.1 , Step.2 과정 전체를 추상화 해준다....
심지어는 간단하게 로그인 시도를 할 수 있는 페이지 까지 제공한다.
아무것도 구현하지 않아도 localhost:8080/login 으로 접속하면 내가 입력한 설정값의 OAuth 목록과 함께 요청을 보내볼 수 있다.
구현 또한 굉장히 간단하다.
OAuth 설정 값만 입력해 주면 OAuth 로그인을 구현해 준다.
설정 값은 인가 코드를 요청할 주소, 토큰 발급을 요청할 주소, 플랫폼에서 발급해준 secret key 값, 리다이렉트 주소 등이 있다.
심지어 설정값만 입력해 주면 카카오, 네이버, 구글, 메타 등 다양한 플랫폼의 OAuth 로그인을 모두 간편하게 구현할 수 있다.
하지만 모든게 완벽할 수는 없는 법
OAuth2.0 Client 라이브러리는 간편하게 구현할 수 있는 대신 커스터마이징 하기가 어렵다는 단점이 있다.
더 디테일한 커스터마이징을 원한다면 OAuth2.0 Login 라이브러리르 사용하면 된다고 한다.