💡 Keycloak - Red Hat에서 개발한 오픈소스 Identity and Access Management(IAM) 솔루션입니다. 현대적인 애플리케이션과 서비스를 위한 인증 및 권한 부여 기능을 제공하는 인증 서버(Authentication Server)의 기능을 수행합니다.
- Keycloack에서는 여러 플랫폼에서 중앙 집중식 인증 서버로 동작을 합니다. 주요한 기능은 서로 다른 도메인에서 실행되는 애플리케이션 간의 SSO를 지원하거나 REST API 기반에 접근제어 토큰에 대한 인증 제공 및 세션 타임아웃, 동시 로그인 제한과 같은 다양한 세션 기능을 담당합니다.
여러 애플리케이션에 대한 인증을 한 곳에서 관리할 수 있어 보안 정책 적용과 유지보수가 용이합니다.
SSO(Single Sign-On) 지원
사용자가 한 번의 로그인으로 여러 애플리케이션에 접근할 수 있어 사용자 경험이 향상됩니다.
다양한 인증 프로토콜
OpenID Connect, SAML 2.0 등 표준 프로토콜을 지원하여 다양한 시스템과의 통합이 가능합니다.
소셜 로그인 통합
Google, Facebook 등 소셜 로그인을 쉽게 구현할 수 있습니다.
강력한 보안 기능
2단계 인증, 비밀번호 정책, 세션 관리 등 다양한 보안 기능을 제공합니다.
오픈소스
무료로 사용 가능하며, 활발한 커뮤니티 지원과 지속적인 업데이트가 이루어집니다.
확장성
REST API를 통한 통합이 용이하며, 커스터마이징이 가능한 유연한 아키텍처를 제공합니다.
2) Google 로그인 연동하기
💡 Google 로그인 연동하기
- Keycloak에서 Google 로그인과 연동하여서 SSO를 구현합니다.
1. Keycloak - Google Social Login - Spring Boot Appplication 처리 과정
💡 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 - 최종적으로 토큰을 사용자에게 반환하면 로그인 수행 처리가 완료가 됩니다.
2. 사전 Google Cloud Console OAuth 2.0 환경 설정
💡 사전 Google Cloud Console OAuth 2.0 환경 설정
- Google 로그인을 수행하기 위해서 Google Cloud Console 내에 환경 설정이 필요합니다. - 해당 설정은 아래의 글을 참고하시면 도움이 됩니다.
2. Add Google provider 내에 각각 속성을 입력하고 ‘Add‘ 버튼을 눌러줍니다.
속성
필수 여부
설명
Redirect URI
선택
Google 로그인 후 리다이렉트될 Keycloak의 콜백 URL
Alias *
필수
Identity Provider의 고유 식별자 (필수)
Display name
선택
로그인 화면에 표시될 이름
Client ID *
필수
Google Cloud Console에서 발급받은 클라이언트 ID (필수)
Client Secret *
필수
Google Cloud Console에서 발급받은 클라이언트 시크릿 (필수)
Display order
선택
여러 소셜 로그인 버튼이 있을 때의 표시 순서
Prompt
선택
Google 로그인 시 사용자에게 표시할 동의 화면 설정
Hosted Domain
선택
특정 G Suite 도메인으로 로그인을 제한할 때 사용
Use userIp param
선택
사용자 IP를 Google에 전송할지 여부
Request refresh token
선택
리프레시 토큰 요청 여부 설정
3. Advanced settings 탭으로 이동하여 ‘Store tokens’ 옵션을 선택하고 ‘Save’ 버튼을 누릅니다.
설정
설명
Store tokens
토큰을 저장할지 여부를 설정
Accepts prompt=none forward from client
클라이언트로부터 prompt=none 파라미터를 수락할지 여부
Disable user info
사용자 정보 엔드포인트 사용을 비활성화할지 여부
Trust Email
Google에서 제공하는 이메일을 신뢰할지 여부
Account linking only
계정 연동만 허용할지 여부
Hide on login page
로그인 페이지에서 Google 로그인 옵션을 숨길지 여부
Verify essential claim
필수 클레임 검증 여부
First login flow override
첫 로그인 시 사용할 인증 플로우 재정의
Post login flow
로그인 후 실행할 추가 플로우 설정
Sync mode
사용자 데이터 동기화 모드 설정 (Legacy/Force/Import)
Case-sensitive username
사용자명 대소문자 구분 여부
[ 더 알아보기 ] 💡 Store tokens 옵션을 선택해야 하는 이유는?
1. 토큰 재사용: 사용자가 다시 인증할 필요 없이 Google API에 접근할 수 있습니다. 2. 세션 관리: 사용자의 소셜 로그인 세션을 효과적으로 관리할 수 있습니다. 3. 토큰 갱신: 리프레시 토큰을 저장하여 액세스 토큰이 만료되었을 때 자동으로 갱신할 수 있습니다. 4. 사용자 경험: 잦은 재인증 없이 원활한 서비스 이용이 가능합니다.
4) Keycloak Social 로그인 구현
1. 지정된 Realm의 endpoint로 접속을 해봅니다.
💡 지정된 Realm의 endpoint로 접속을 해봅니다
- 이 엔드포인트는 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. keycloak 내의 Google Login이 추가되어서 출력되었습니다.
💡 해당 과정은 아래의 과정을 처리합니다. 2. Google 로그인 아이콘을 누른 경우, 로그인 페이지를 제공 : Keycloak 로그인 화면 → Google - Keycloak 로그인 화면에서 Google 로그인 아이콘을 누르면 Google Login 페이지를 제공합니다.
3. 구글 로그인 수행
💡 구글 로그인 수행
- 해당 클라이언트(Spring-boot-app)에 사용자를 로그인합니다.
💡 해당 과정은 아래의 과정을 처리합니다.
3. Google 로그인 아이콘을 누른 경우, 로그인 페이지를 제공 : Keycloak 로그인 화면 → Google - Keycloak 로그인 화면에서 Google 로그인 아이콘을 누르면 Google Login 페이지를 제공합니다.
4. [참고] 아래와 같이 400 오류: redirect_uri_mismatch가 발생하였습니다.
💡 [참고] 아래와 같이 400 오류: redirect_uri_mismatch가 발생하였습니다.
- 아래와 같은 오류는 Google Cloud Console 내에서 redirect url을 keycloak redirect로 입력하지 않은 오류입니다. - 처리과정은 사용자 -> Keycloak -> Google -> Keycloak -> 클라이언트 애플리케이션 와 같은 형태로 처리가 됩니다. - 그렇기에 해당 과정에서 Google에서 keycloak로 리다이렉트 되어서 클라이언트 애플리케이션으로 리다이렉트 되는 구조로 구성되어야 합니다.
💡 [참고] 수정은 아래의 Google Cloud > 애플리케이션 선택에서 변경이 가능합니다.
- 아래의 승인된 리다이렉션 URL에 Keycloak에서 발급받은 엔드포인트로 호출을 합니다.
5. 로그인 성공 후 Keycloak 리다이렉트 URL로 반환합니다.
💡 로그인 성공 후 Keycloak 리다이렉트 URL로 반환합니다.
- 아래의 Google Cloud 내에서 지정한 승인된 리다이렉션 URI로 리턴을 하게 됩니다.
💡 위에 리다이렉션을 통해 Keycloak의 Google Provider에게 전달이 되고 지정한 엔드포인트로 반환이 됩니다.
- 즉, Google → Keycloak으로 반환이 되는 과정입니다.
💡 해당 과정은 아래의 과정을 처리합니다. 5. Google 로그인 성공 후 Keycloak 리다이렉트 URL로 반환해 줍니다. : Google → Keycloak 관리 서버
- Google에서 지정한 redirect_uri를 기반으로 Keycloak 관리서버로 리다이렉트 됩니다. - 구성한 URL: http://localhost:9001/realms/dev-realm/broker/google/endpoint
5. Keycloak에서 redirect_uri를 지정한 엔드포인트로 리턴을 하여 인가 코드(Authentication Code)를 전달받습니다.
💡 Keycloak에서 redirect_uri를 지정한 엔드포인트로 리턴을 하여 인가 코드(Authentication Code)를 전달받습니다.
- 해당 과정은 Google → Keycloak → Appliction으로 전달받는 과정으로 최초 클라이언트가 파라미터로 전달한 redirect_uri 엔드포인트로 Controller에게 전달이 됩니다.
💡 최초 로그인 페이지가 출력되는 단계에서 redirect_uri를 입력하였습니다.
- 구글 로그인 수행이 완료된 다음에 해당 uri로 리다이렉트 되는 과정입니다.
💡 KeycloakController
- 아래는 일반 사용자 로그인과 동일한 API를 사용합니다. 그렇기에 OAuth 2.0용을 위한 Controller의 구성없이 사용하였습니다.
💡 위에 구성을 통해 최종적으로 아래와 같이 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 - 최종적으로 토큰을 사용자에게 반환하면 로그인 수행 처리가 완료가 됩니다.
5) 결과 확인
💡 결과 확인
- Google Login을 통해 로그인이 수행되고, Access Token이 생성되는 과정이였습니다. - Keycloak에 접속하여서 확인을 하면 사용자로 추가가 됨을 확인할 수 있습니다.
💡 해당 사용자를 선택하고 Identity provider links 탭으로 이동하면 Google Social Login이 됨을 확인할 수 있습니다.