먼저, 간단한 Frontend와 Backend 간의 OAuth 2 인증 처리 흐름은 다음과 같다.
구글 벤더를 사용하는 OAuth 2를 예시로 자세한 과정을 살펴보자.
- Resource Owner가 웹 브라우저에서 ‘Google 로그인 링크’를 클릭
- Frontend 애플리케이션에서 Backend 애플리케이션의 http://localhost:8080/oauth2/authorization/google로 request를 전송 (이 URI의 requet는 OAuth2LoginAuthenticationFilter가 처리)
- Google의 로그인 화면을 요청하는 URI로 Redirect
여기서 Authorization Server가 Backend 애플리케이션 쪽으로 Authorization Code를 전송할 Redirect URI(http://localhost:8080/login/oauth2/code/google)를 쿼리 파라미터로 전달
(Redirect URI는 Spring Security가 내부적으로 제공) - Google 로그인 화면을 오픈
- Resource Owner가 Goole 로그인 인증 정보를 입력해서 로그인을 수행
- 로그인에 성공하면, 이전에 전달한 Backend Redirect URI(http://localhost:8080/login/oauth2/code/google)로 Authorization Code를 요청
- Authorization Server가 Backend 애플리케이션에게 Authorization Code를 응답으로 전송
- Backend 애플리케이션이 Authorization Server에게 Access Token을 요청
- Authorization Server가 Backend 애플리케이션에게 Access Token을 응답으로 전송
(Access Token은 Google Resource Server에게 Resource를 요청하는 용도로 사용) - Backend 애플리케이션이 Resource Server에게 User Info를 요청
(User Info는 Resource Owner에 대한 이메일 주소, 프로필 정보 등을 의미) - Resource Server가 Backend 애플리케이션에게 User Info를 응답으로 전송
- 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
'Develop > Spring' 카테고리의 다른 글
Spring WebFlux - Reactor (Project Reactor) (0) | 2022.11.30 |
---|---|
Spring Webflux - Reactive Programming (0) | 2022.11.29 |
OAuth 2 샘플 애플리케이션 구현 (0) | 2022.11.28 |
OAuth2 개요 (0) | 2022.11.25 |
JWT - Secret Key를 시스템 환경 변수로 등록할 때 주의점 (0) | 2022.11.25 |