Spring security와 OAuth2. 개념 정리

🔥Log·2022년 12월 18일
2

스프링과 OAuth2

목록 보기
1/11

☕ 시작


이번 글에서는 OAuth2에 대해서 알아보고, 이것을 Spring security에서는 어떻게 지원하고 있는지 살펴보도록 하겠다.
이번에는 개념적인 것들에 대해서 주로 다룰 예정이다.
실무에서의 적용과 예제들은 다음 글들을 통해서 다뤄보도록 하겠다.


🧐 OAuth2란?


요즘의 IT 서비스 종류는 매우 다양하다. (웹서비스, 모바일앱, IOT기기등등)
이런 다양한 환경에서도 당연하게 로그인, 사용자 인증과 같은 절차는 필수적으로 이루어진다. 이렇게 다양한 환경을 모두 아우를 수 있도록 사용자 인증 절차를 표준화한 것이 OAuth이다.

그리고 OAuth2는 이름에서도 알 수 있듯이 OAuth의 2번째 버전이고, 현재는 OAuth2가 RFC 표준으로 등록되어서 사용되고 있다.
OAuth2는 기본적으로 아래의 흐름을 갖고 있다.

🔥 OAuth2의 인증/인가 흐름

  1. 로그인
  2. 만료기간이 있는 토큰 발급
  3. 발급 받은 토큰으로 서버의 자원(api로 제공됨)에 접근
  4. 서버에서 토큰을 검증 후 사용자의 접근을 허용하거나 차단
  5. (토큰이 만료됐다면, Refresh token으로 토큰 갱신)

위의 흐름은 가장 기본이 되는 굵직한 흐름이다.
서비스의 목적이나 상황에 따라서 세세하게 다른 인증/인가 흐름을 사용자에게 제공할 수 있다.

계속 토큰이 어쩌구 저쩌구 얘기하고 있는데, 이 토큰에 대해서 좀 더 자세히 살펴보자. 🤭


🔥 토큰?

토큰은 쉽게 얘기하면 입장권이라고 보면 된다.

🐶 에버랜드 입장권 🐱
이름: 홍길동
입장가능 구역: 동물원
입장권 만료일: 2022-12-31

이 입장권을 통해서 접근이 허용된 서버의 자원에 접근할 수 있는 것이다.
이 토큰에도 여러 종류가 있고, 다음과 같다.

  1. 🪙 Access Token
    • 특정 자원에 '접근'할 때 사용한다.
    • 클라이언트에서는 access token을 해석할 수 없어야하고, 서버에서 해석할 수 있어야한다. (탈취될 가능성이 있으므로)
    • JWT형식 또는 UUID등등 원하는 형태로 발급할 수 있다.
    • 예시: 로그인 -> Access token 발급 받음 -> Access token을 헤더에 추가한 후 서버에 api요청 -> 서버가 Access token을 validation -> validation에 통과했다면 요청에 맞게 응답
  2. 🪙 Id Token
    • 인증 받은 사용자의 정보가 포함돼있는 토큰이다. JWT형식으로 발급 된다. (Id 토큰을 발급하는 측에서는 비밀번호와 같은 민감한 정보는 절대 Id 토큰에 포함시키면 안된다.)
    • 토큰을 발급받은 사용자측에서 사용하기 위한 토큰이다.
  3. 🪙 Refresh Token
    • Access token은 만료 기간을 갖고 있기 때문에 만료 기간이 지나도 서버 자원에 접근하고 싶다면, Access token을 갱신해야한다. 이 때 사용하는 토큰이 Refresh token이다.

🔥 인증 유형

OAuth2는 기본적으로 다양한 플랫폼에서의 인증 절차를 표준화하기 위해 만들어진 것이고, 그에 맞게 다양한 형태의 인증방식을 제공한다. 이에 대해서 모두 살펴보긴 좀 그렇고, 대표적인 것만 살펴보겠다. 🤭

  • Authorization Code: 가장 범용적인 방식으로, 로그인에 성공하면 Access token을 발급하는 형태이다.
  • PKCE: Authorization code에 보안 기능이 추가된 형태이다. code verifier를 인증서버에서 갖고 있고, code challenge를 사용자 측에서 갖고 있고, 이를 활용해서 옳바른 요청인지 검증하는 플로우가 추가됐다. 가장 권장되는 형태이다 ㅎㅎ
  • Client Credentials
  • Device code
  • Implicit flow (deprecated)
  • Password grant (deprecated)

이 이외에도 이야기할 게 정말 많지만, 핵심은 위에 정리한 내용이다. 더 자세한 것은 공식문서를 확인해보자!

그렇다면, 이번에는 이 OAuth2 표준을 Spring 에서는 어떻게 구현했는지 알아보자.


🍃 Spring security와 OAuth2


OAuth2를 사용한다는 것은 인증/인가에 대한 권한을 다른 서버에서 처리한다는 것과 같다. 즉, 아래와 같은 구조를 갖게 된다.

좀 더 실제적으로 표현한다면 이렇게 된다.
(Ex. 프론트 엔드와 백엔드가 분리되어 있는 서비스)

위와 같은 구조를 갖게 되면 다양한 장점이 생긴다.

👍 OAuth2를 사용하면 갖게 되는 장점

  • 동일한 사용자 정보로 다양한 서비스를 다양한 플랫폼에서 제공할 수 있다.
  • 로그인 세션을 서버에 생성하지 않으므로, 서버의 부담을 줄여준다.
  • 세션보다 보안적인 측면에서 더 낫다고 한다. (OAuth2 시스템에 구멍없이 잘 구축됐다는 가정하에)

서론이 좀 길었으니 바로 본론으로 들어가보자.
지금부터 스프링에서 OAuth2 시스템 구축을 위해서 제공하는 기능들을 살펴보겠다.
크게 3가지로 나눌 수 있다.

  1. OAuth2 Log in
  2. OAuth2 Client
  3. OAuth2 Resource server

하나 하나 자세히 살펴보자! 🔥 (공식문서)


⭐ 기능1: oAuth2Login()


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)가 되는 것이므로 해당 설정을 해줄 필요가 없다.


⭐ 기능2: oAuth2Client()


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();
    }
}

⭐ 기능3: oAuth2ResourceServer()


개발할 Spring애플리케이션이 자원을 제공할 서버에 해당할 때, 필요한 기능들을 제공한다.'
즉, FE와 BE가 분리된 형태의 서비스를 구축할 때, 필요한 것이다. 클라이언트(FE)에서 전달하는 Access token같은 것들의 타당성을 검증하는 역할등을 수행할 수 있다.

이에 대한 내용은 실제로 내가 개발중인 서비스에 해당하는 내용이고, 상세하게 다루고 싶어서 다음 글에서 실제 예제와 함께 소개해보도록하겠다! 🔥
(일단은 느낌만 살짝 보는 것으로 ㅎㅎ)


🙏 마무리


이번 글에서는 OAuth2와 Spring security oauth2에 대한 개념적인 내용들을 정리해보았다.
사실 이번 글은 실무와 예제들을 살펴볼 다음 글들을 위한 빌드업이여서, 다음 글들이 기대가 된다 ㅎㅎ
(자기가 쓰고 자기가 기?대 🙊)

그럼 이만 👍

0개의 댓글