본문 바로가기
Develop/Spring

OAuth 2 + JWT 샘플 애플리케이션 구현

by jaeyoungb 2022. 11. 29.

먼저, 간단한 Frontend와 Backend 간의 OAuth 2 인증 처리 흐름은 다음과 같다.

 

https://softwareengineering.stackexchange.com/questions/337579/architecture-for-oauth2-backendserver-frontendserver

 

구글 벤더를 사용하는 OAuth 2를 예시로 자세한 과정을 살펴보자.

 

  1. Resource Owner가 웹 브라우저에서 ‘Google 로그인 링크’를 클릭
  2. Frontend 애플리케이션에서 Backend 애플리케이션의 http://localhost:8080/oauth2/authorization/google로 request를 전송 (이 URI의 requet는 OAuth2LoginAuthenticationFilter가 처리)
  3. Google의 로그인 화면을 요청하는 URI로 Redirect
    여기서 Authorization Server가 Backend 애플리케이션 쪽으로 Authorization Code를 전송할 Redirect URI(http://localhost:8080/login/oauth2/code/google)를 쿼리 파라미터로 전달
    (Redirect URI는 Spring Security가 내부적으로 제공)
  4. Google 로그인 화면을 오픈
  5. Resource Owner가 Goole 로그인 인증 정보를 입력해서 로그인을 수행
  6. 로그인에 성공하면, 이전에 전달한 Backend Redirect URI(http://localhost:8080/login/oauth2/code/google)로 Authorization Code를 요청
  7. Authorization Server가 Backend 애플리케이션에게 Authorization Code를 응답으로 전송
  8. Backend 애플리케이션이 Authorization Server에게 Access Token을 요청
  9. Authorization Server가 Backend 애플리케이션에게 Access Token을 응답으로 전송
    (Access Token은 Google Resource Server에게 Resource를 요청하는 용도로 사용)
  10. Backend 애플리케이션이 Resource Server에게 User Info를 요청
    (User Info는 Resource Owner에 대한 이메일 주소, 프로필 정보 등을 의미)
  11. Resource Server가 Backend 애플리케이션에게 User Info를 응답으로 전송
  12. Backend 애플리케이션은 JWT로 구성된 Access Token과 Refresh Token을 생성
    그리고, Frontend 애플리케이션에게 JWT(Access Token과 Refresh Token)를 전달하기 위해 Frontend 애플리케이션(http://localhost?access_token={jwt-access-token}&refresh_token={jwt-refresh-token})으로 Redirect

 

## Frontend 애플리케이션과 Backend 애플리케이션의 OAuth 2 인증 처리 흐름에서 Backend 애플리케이션이 Authorization Server, Resource Server와 interaction하는 과정은 Spring Security에서 내부적으로 대신 처리해준다.

 

 

이제 구현 단계를 알아보자.

 

1. Frontend 애플리케이션 준비

 

2. JwtTokenizer 추가

- Backend 애플리케이션에 JWT를 생성하고 검증하는 클래스

 

3. application.yml 파일에 JWT와 OAuth2에 관한 설정 추가

 

4. JwtVerificationFilter 추가

- OAuth 2 인증에 성공하면 Frontend 애플리케이션 쪽에서 request를 전송할 때마다 Authorization header에 실어보내는 Access Token에 대한 검증을 수행하는 Filter 클래스

 

5. AuthenticationSuccessHandler 구현

- OAuth 2 인증에 성공하면 호출되는 핸들러 클래스

- JWT를 생성해서 Frontend 쪽으로 전송하기 위한 Redirect 로직을 구현

 

6. SecurityConfiguration 설정

 

7. 기타 코드 수정

- OAuth 2 인증 시스템을 사용하기 때문에 회원 정보를 등록 및 수정할 필요가 없으므로 관련된 Controller, Dto, Service, Entity 클래스의 회원 정보를 등록 및 수정 로직을 수정 및 제거

 

 

## Authorization Server와 Resource Server간에 주고 받는 JWT의 보안성을 강화하기 위해 비대칭키 방식의 서명도 사용할 수 있다.

 

 

- OAuth2ClientAuthenticationProcessingFilter
- https://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/client/filter/OAuth2ClientAuthenticationProcessingFilter.html