이번 글에서는 OAuth2에 대해서 알아보고, 이것을 Spring security에서는 어떻게 지원하고 있는지 살펴보도록 하겠다.
이번에는 개념적인 것들에 대해서 주로 다룰 예정이다.
실무에서의 적용과 예제들은 다음 글들을 통해서 다뤄보도록 하겠다.
요즘의 IT 서비스 종류는 매우 다양하다. (웹서비스, 모바일앱, IOT기기등등)
이런 다양한 환경에서도 당연하게 로그인, 사용자 인증과 같은 절차는 필수적으로 이루어진다. 이렇게 다양한 환경을 모두 아우를 수 있도록 사용자 인증 절차를 표준화한 것이 OAuth
이다.
그리고 OAuth2는 이름에서도 알 수 있듯이 OAuth의 2번째 버전이고, 현재는 OAuth2가 RFC 표준으로 등록되어서 사용되고 있다.
OAuth2는 기본적으로 아래의 흐름을 갖고 있다.
위의 흐름은 가장 기본이 되는 굵직한 흐름이다.
서비스의 목적이나 상황에 따라서 세세하게 다른 인증/인가 흐름을 사용자에게 제공할 수 있다.
계속 토큰이 어쩌구 저쩌구 얘기하고 있는데, 이 토큰에 대해서 좀 더 자세히 살펴보자. 🤭
토큰은 쉽게 얘기하면 입장권이라고 보면 된다.
🐶 에버랜드 입장권 🐱
이름: 홍길동
입장가능 구역: 동물원
입장권 만료일: 2022-12-31
이 입장권을 통해서 접근이 허용된 서버의 자원에 접근할 수 있는 것이다.
이 토큰에도 여러 종류가 있고, 다음과 같다.
OAuth2는 기본적으로 다양한 플랫폼에서의 인증 절차를 표준화하기 위해 만들어진 것이고, 그에 맞게 다양한 형태의 인증방식을 제공한다. 이에 대해서 모두 살펴보긴 좀 그렇고, 대표적인 것만 살펴보겠다. 🤭
code verifier
를 인증서버에서 갖고 있고, code challenge
를 사용자 측에서 갖고 있고, 이를 활용해서 옳바른 요청인지 검증하는 플로우가 추가됐다. 가장 권장되는 형태이다 ㅎㅎ이 이외에도 이야기할 게 정말 많지만, 핵심은 위에 정리한 내용이다. 더 자세한 것은 공식문서를 확인해보자!
그렇다면, 이번에는 이 OAuth2 표준을 Spring 에서는 어떻게 구현했는지 알아보자.
OAuth2를 사용한다는 것은 인증/인가에 대한 권한을 다른 서버에서 처리한다는 것과 같다. 즉, 아래와 같은 구조를 갖게 된다.
좀 더 실제적으로 표현한다면 이렇게 된다.
(Ex. 프론트 엔드와 백엔드가 분리되어 있는 서비스)
위와 같은 구조를 갖게 되면 다양한 장점이 생긴다.
서론이 좀 길었으니 바로 본론으로 들어가보자.
지금부터 스프링에서 OAuth2 시스템 구축을 위해서 제공하는 기능들을 살펴보겠다.
크게 3가지로 나눌 수 있다.
하나 하나 자세히 살펴보자! 🔥 (공식문서)
oAuth2Login은 OAuth2를 활용한 로그인 Flow 자체를 제공하는 기능이다.
아래와 같이 oAuth2Login을 사용하겠다고 설정파일을 생성하면, OAuth2 로그인기능을 사용할 수 있게 된다.
(물론 모든 기능은 설정을 통해서 커스터마이징이 가능하다)
@Configuration
public class OAuth2LoginConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().anyRequest().authenticated(); // 어떤 경로든 접근하려면 인증을 받으라는 설정
http.oauth2Login(Customizer.withDefaults());
return http.build();
}
}
이는 Spring으로 개발할 애플리케이션이 Client
가 될 때, 사용하면 되는 기능이다.
예를들어서, 프론트엔드가 따로 있는 경우에는 Spring은 자원을 제공할 서버(Resource Server)가 되는 것이므로 해당 설정을 해줄 필요가 없다.
oAuth2Login()
과 마찬가지로 Spring 애플리케이션에서 클라이언트 역할을 수행해야할 때, 사용하는 기능이다. oAuth2Login이 인증/인가 흐름 자체를 제공했다면, oAuth2Client는 클라이언트에서 수행할 역할들을 단위 단위 별로 쪼개서 원하는 대로 구현할 수 있게 기능을 제공한다고 보면 된다.
예를 들어서 Google, Naver등등 외부의 인증 서버와 연동을 해서 로그인을 구현하고 싶을 때, Spring서버가 Client가 되어야하는데, 이 때 oAuth2Client()를 사용하면 된다.
설정은 아래와 같이 할 수 있다.
(이 또한 물론 모든 기능이 설정을 통해서 커스터마이징이 가능하다)
@Configuration
public class OAuth2LoginConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().anyRequest().authenticated(); // 어떤 경로든 접근하려면 인증을 받으라는 설정
http.oauth2Client(Customizer.withDefaults());
return http.build();
}
}
개발할 Spring애플리케이션이 자원을 제공할 서버에 해당할 때, 필요한 기능들을 제공한다.'
즉, FE와 BE가 분리된 형태의 서비스를 구축할 때, 필요한 것이다. 클라이언트(FE)에서 전달하는 Access token같은 것들의 타당성을 검증하는 역할등을 수행할 수 있다.
이에 대한 내용은 실제로 내가 개발중인 서비스에 해당하는 내용이고, 상세하게 다루고 싶어서 다음 글에서 실제 예제와 함께 소개해보도록하겠다! 🔥
(일단은 느낌만 살짝 보는 것으로 ㅎㅎ)
이번 글에서는 OAuth2와 Spring security oauth2에 대한 개념적인 내용들을 정리해보았다.
사실 이번 글은 실무와 예제들을 살펴볼 다음 글들을 위한 빌드업이여서, 다음 글들이 기대가 된다 ㅎㅎ
(자기가 쓰고 자기가 기?대 🙊)
그럼 이만 👍