💡 Keycloak - Red Hat에서 개발한 오픈소스 Identity and Access Management(IAM) 솔루션입니다. 현대적인 애플리케이션과 서비스를 위한 인증 및 권한 부여 기능을 제공하는 인증 서버(Authentication Server)의 기능을 수행합니다.
- Keycloack에서는 여러 플랫폼에서 중앙 집중식 인증 서버로 동작을 합니다. 주요한 기능은 서로 다른 도메인에서 실행되는 애플리케이션 간의 SSO를 지원하거나 REST API 기반에 접근제어 토큰에 대한 인증 제공 및 세션 타임아웃, 동시 로그인 제한과 같은 다양한 세션 기능을 담당합니다.
💡 Keycloak - Google Social Login - Spring Boot Appplication 처리 과정
1. Keycloak URL 접근 및 Google 로그인 수행: Client → Keycloak 관리 서버 - 최초 클라이언트는 Keycloak 로그인 페이지로 접근을 합니다. 해당 접근 시, 최종 리턴이 되는 Spring Boot Application의 엔드포인트 redirect_uri를 함께 파라미터에 담아서 전송합니다. - 접속 URL 형태 : /reams/{realm-name}/protocol/openid-connect/auth?client_id={keyclaokClient}?response_type=code&redirect_uri={applicationRedirectUri} - 사용한 URL : http://localhost:9001/realms/dev-realm/protocol/openid-connect/auth?client_id=spring-boot-app&response_type=code&redirect_uri=http://localhost:8080/api/v1/keycloak/callback
2. Google 로그인이 포함된 Keycloak 로그인 화면을 클라이언트에게 제공 : Keycloak 관리 서버 → Keycloak 로그인 화면 - Keycloak 관리서버에서는 Keylcloak 로그인화면을 제공합니다.
3. Google 로그인 아이콘을 누른 경우, 로그인 페이지를 제공 : Keycloak 로그인 화면 → Google - Keycloak 로그인 화면에서 Google 로그인 아이콘을 누르면 Google Login 페이지를 제공합니다.
4. Google 로그인 성공 후 Keycloak 리다이렉트 URL로 반환해 줍니다. : Google → Keycloak 관리 서버 - Google에서 지정한 redirect_uri를 기반으로 Keycloak 관리서버로 리다이렉트 됩니다. - 구성한 URL: http://localhost:9001/realms/dev-realm/broker/google/endpoint
5. Keycloak에서는 최초 클라이언트가 파라미터로 전달한 redirect_uri 엔드포인트로 리턴하며 반환 값으로 인가 코드(Auth Code)를 전달 : Keycloak 관리 서버 → KeycloakController - Keycloak에서는 최초 클라이언트가 파라미터로 함께 보냈던 redirect_uri 엔드포인트로 파라미터에 인가 코드(Auth Code)를 포함하여서 전달합니다.
6. getAccessToken(authToken) 서비스 메서드를 호출하여 인가코드(authCode) 전달 : Controller → Service
- Controller에서는 전달받은 인가코드(Auth Code)를 기반으로 getAccessToken()이라는 서비스 메서드를 호출하여 데이터를 전달합니다.
7. accessToken 요청 : http://localhost:9001/realms/dev-realm/protocol/openid-connect/token : Service → Keycloak 관리 서버 - Spring Boot Application에서는 인가 코드(Auth Code)를 기반으로 리소스 접근 토큰(Access Token)을 반환받기 위해 Keycloak 관리서버에 호출하여 토큰 발급 요청을 수행합니다.
8. 접근 토큰(Access Token) 반환 : Keycloak 관리 서버 → Service - 인가 코드(Auth Code)를 기반으로 접근 토큰을 발급하여 Service로 전달합니다.
9. 발급된 접근토큰 반환 : Service → Controller - 반환받은 접근 토큰을 다시 Controller에게 반환합니다.
10. 접근 토큰(AccessToken) 반환 : Controller → Client - 최종적으로 토큰을 사용자에게 반환하면 로그인 수행 처리가 완료가 됩니다.
1. 토큰 재사용: 사용자가 다시 인증할 필요 없이 Google API에 접근할 수 있습니다. 2. 세션 관리: 사용자의 소셜 로그인 세션을 효과적으로 관리할 수 있습니다. 3. 토큰 갱신: 리프레시 토큰을 저장하여 액세스 토큰이 만료되었을 때 자동으로 갱신할 수 있습니다. 4. 사용자 경험: 잦은 재인증 없이 원활한 서비스 이용이 가능합니다.
- 이 엔드포인트는 OAuth 2.0/OpenID Connect의 Authorization Code Flow에서 사용되는 인증 엔드포인트입니다. 사용자를 인증하고 권한을 부여받기 위한 첫 단계로 사용됩니다. - 인증 코드(Authentication Code)를 먼저 발급받은 후, 이를 통해 액세스 토큰을 얻는 2단계 인증과정에서 사용합니다.
💡 해당 과정은 아래의 과정을 처리합니다. 1. Keycloak URL 접근 및 Google 로그인 수행: Client → Keycloak 관리 서버 - 최초 클라이언트는 Keycloak 로그인 페이지로 접근을 합니다. 해당 접근 시, 최종 리턴이 되는 Spring Boot Application의 엔드포인트 redirect_uri를 함께 파라미터에 담아서 전송합니다. - 접속 URL 형태 : /reams/{realm-name}/protocol/openid-connect/auth?client_id={keyclaokClient}?response_type=code&redirect_uri={applicationRedirectUri} - 사용한 URL : http://localhost:9001/realms/dev-realm/protocol/openid-connect/auth?client_id=spring-boot-app&response_type=code&redirect_uri=http://localhost:8080/api/v1/keycloak/callback
💡 해당 과정은 아래의 과정을 처리합니다. 2. Google 로그인 아이콘을 누른 경우, 로그인 페이지를 제공 : Keycloak 로그인 화면 → Google - Keycloak 로그인 화면에서 Google 로그인 아이콘을 누르면 Google Login 페이지를 제공합니다.
💡 [참고] 아래와 같이 400 오류: redirect_uri_mismatch가 발생하였습니다.
- 아래와 같은 오류는 Google Cloud Console 내에서 redirect url을 keycloak redirect로 입력하지 않은 오류입니다. - 처리과정은 사용자 -> Keycloak -> Google -> Keycloak -> 클라이언트 애플리케이션 와 같은 형태로 처리가 됩니다. - 그렇기에 해당 과정에서 Google에서 keycloak로 리다이렉트 되어서 클라이언트 애플리케이션으로 리다이렉트 되는 구조로 구성되어야 합니다.
💡 [참고] 수정은 아래의 Google Cloud > 애플리케이션 선택에서 변경이 가능합니다.
- 아래의 승인된 리다이렉션 URL에 Keycloak에서 발급받은 엔드포인트로 호출을 합니다.
💡 위에 구성을 통해 최종적으로 아래와 같이 access_token을 반환함을 확인하였습니다.
💡 해당 과정은 아래의 과정을 처리합니다. 7. accessToken 요청 : http://localhost:9001/realms/dev-realm/protocol/openid-connect/token : Service → Keycloak 관리 서버 - Spring Boot Application에서는 인가 코드(Auth Code)를 기반으로 리소스 접근 토큰(Access Token)을 반환받기 위해 Keycloak 관리서버에 호출하여 토큰 발급 요청을 수행합니다.
8. 접근 토큰(Access Token) 반환 : Keycloak 관리 서버 → Service - 인가 코드(Auth Code)를 기반으로 접근 토큰을 발급하여 Service로 전달합니다.
9. 발급된 접근토큰 반환 : Service → Controller - 반환받은 접근 토큰을 다시 Controller에게 반환합니다.
10. 접근 토큰(AccessToken) 반환 : Controller → Client - 최종적으로 토큰을 사용자에게 반환하면 로그인 수행 처리가 완료가 됩니다.