OAuth2์ OpenID Connect๋ฅผ ์ค๋ฌด ์์ค์์ ๊ตฌํํ๋ ๊ฐ์ฅ ํ์ค์ ์ธ ์ ๊ทผ
JWT๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ Stateless ์ธ์ฆ์ ๊ฐ๋ ฅํ์ง๋ง,
๊ธฐ์ ํ๊ฒฝ(Enterprise)์์๋ ๋ค์๊ณผ ๊ฐ์ ํ์ค์ ์ธ ํ๊ณ๊ฐ ์๋ค.
| ๋ฌธ์ | ์ค๋ช |
|---|---|
| ์ค์์ง์คํ ์ธ์ฆ ๋ถ์ฌ | ๊ฐ ์๋น์ค๊ฐ ์ง์ ๋ก๊ทธ์ธยทํ ํฐ ๋ฐ๊ธ ๋ก์ง์ ๊ตฌํํด์ผ ํจ |
| ์กฐ์ง ๋ด ๋ค์ค ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ ์ด๋ ค์ | ์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ ๊ณ์ , ๊ถํ, ์ญํ ์ ํตํฉ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๋ค |
| ๋ณด์ ๊ท์ ์ค์ ๋ฌธ์ | OAuth2๋ง์ผ๋ก๋ SSO, MFA, LDAP, SAML ๊ฐ์ ๊ธฐ์ ์๊ตฌ ๋์์ด ์ ํ์ |
| ์ด์ ํจ์จ์ฑ ์ ํ | ์ฌ์ฉ์ยท๊ถํ ๋ณ๊ฒฝ ์ ๋ชจ๋ ์๋น์ค ๋ฐฐํฌ ํ์ |
โก๏ธ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด Keycloak์ด๋ค.
Keycloak์ Red Hat์ด ์ฃผ๋ํ๋ ์คํ์์ค ์ธ์ฆยท์ธ๊ฐ ์๋ฒ์ด๋ค.
OAuth2, OpenID Connect(OIDC), SAML 2.0, LDAP ์ฐ๋, SSO๊น์ง ์๋น๋
Identity and Access Management (IAM) ์๋ฃจ์ ์ด๋ค.
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ๊ธฐ๋ฐ ํ๋กํ ์ฝ | OAuth2, OpenID Connect, SAML |
| ์ฃผ์ ๊ธฐ๋ฅ | ๋ก๊ทธ์ธ/๋ก๊ทธ์์, ์ฌ์ฉ์ ๋ฑ๋ก, ๋น๋ฐ๋ฒํธ ์ ์ฑ , MFA, ์ธ์ ๊ด๋ฆฌ |
| ์ฐ๋ ๋ฐฉ์ | REST API / OIDC Discovery / JWT Token |
| ๋ฐฐํฌ ๋ฐฉ๋ฒ | Docker, Kubernetes, Standalone JAR, Operator |
| Spring ์ฐ๋ ๋ฐฉ์ | spring-boot-starter-oauth2-resource-server ๋๋ spring-boot-starter-oauth2-client |

์์ฝ
docker run -d \
--name keycloak \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:24.0.4 start-dev
http://localhost:8080
adminadminAdd Realm โ eazybankeazybank-clientopenid-connectpublichttp://localhost:4200/*happy@example.compasswordROLE_USERROLE_USER, ROLE_ADMIN ๋ฑ| Grant Type | ์ค๋ช | ๋ํ ์ฌ์ฉ์ฒ |
|---|---|---|
| Authorization Code | ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ธ์ฆ (PKCE ํฌํจ) | ์น/๋ชจ๋ฐ์ผ ํด๋ผ์ด์ธํธ |
| Client Credentials | ์๋ฒ ๊ฐ ํต์ | ๋ฐฑ์๋ ๋ง์ดํฌ๋ก์๋น์ค |
| Password | Deprecated (์ง์ ์๊ฒฉ์ฆ๋ช ์ ๋ฌ) | ํ ์คํธ์ฉ๋ง |
| Refresh Token | Access Token ์ฌ๋ฐ๊ธ | ์ฅ๊ธฐ ์ธ์ ๊ด๋ฆฌ |
๋ณด์ ๊ฐํ๋ฅผ ์ํด ํด๋ผ์ด์ธํธ๋ PKCE(Proof Key for Code Exchange) ๋ฅผ ์ฌ์ฉํ๋ค.

| ๊ตฌ๋ถ | ๋ชฉ์ | ํฌํจ ์ ๋ณด | ์ฌ์ฉ ์์น |
|---|---|---|---|
| Access Token | ๋ฆฌ์์ค ์ ๊ทผ ์ธ์ฆ | ๊ถํ, Scope, ๋ง๋ฃ์๊ฐ | Resource Server |
| ID Token | ์ฌ์ฉ์ ์๋ณ | ์ฌ์ฉ์ ์ด๋ฆ, ์ด๋ฉ์ผ, ์ธ์ฆ ์ ๋ณด | ํด๋ผ์ด์ธํธ ์ธก (UI) |
| Refresh Token | ํ ํฐ ๊ฐฑ์ | ๋ง๋ฃ์๊ฐ, ์ธ์ ์๋ณ์ | Authorization Server |
application.yml ์์:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/realms/eazybank
SecurityConfig.java:
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated())
.oauth2ResourceServer(oauth2 -> oauth2.jwt());
return http.build();
}
Authorization ํญ โ Type: OAuth2
Token URL:
http://localhost:8080/realms/eazybank/protocol/openid-connect/token
Client ID: eazybank-client
Grant Type: Authorization Code
Scope: openid profile email
Callback URL: http://localhost:4200/
ํ ํฐ ๋ฐ๊ธ ์ฑ๊ณต ์ ๋ค์ ํ๋ ํ์ธ:
{
"access_token": "...",
"id_token": "...",
"refresh_token": "...",
"expires_in": 300
}
angular-oauth2-oidc ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉimport { AuthConfig } from 'angular-oauth2-oidc';
export const authConfig: AuthConfig = {
issuer: 'http://localhost:8080/realms/eazybank',
redirectUri: window.location.origin,
clientId: 'eazybank-client',
scope: 'openid profile email',
responseType: 'code',
showDebugInformation: true,
usePkce: true
};

| ๊ตฌ์ฑ์์ | ์ค๋ช |
|---|---|
| Angular | ํด๋ผ์ด์ธํธ (Auth Code Flow ์ํ) |
| Keycloak | ์ธ์ฆยท์ธ๊ฐ ์๋ฒ (Token ๋ฐ๊ธ) |
| Spring Boot | Resource Server (JWT ๊ฒ์ฆ) |
| ๋น๊ต ํญ๋ชฉ | Keycloak | Okta | AWS Cognito |
|---|---|---|---|
| ์คํ์์ค ์ฌ๋ถ | โ ์์ ์คํ์์ค | โ ์ ๋ฃ SaaS | โ ์ ํ์ |
| ์์ฒด ํธ์คํ | โ ๊ฐ๋ฅ | โ ๋ถ๊ฐ | โ ๊ฐ๋ฅ |
| ์ง์ ํ๋กํ ์ฝ | OAuth2, OIDC, SAML | OAuth2, OIDC | OAuth2, OIDC |
| ํ์ฅ์ฑ | ๋์ (Plugin, SPI) | ์ค๊ฐ | ๋ฎ์ |
| ํตํฉ ๊ด๋ฆฌ | Realm ๋จ์ ๊ด๋ฆฌ | ์กฐ์ง ๋จ์ ๊ด๋ฆฌ | User Pool ๋จ์ ๊ด๋ฆฌ |
| ์์ญ | ๋ชจ๋ฒ ์ฌ๋ก |
|---|---|
| Secret ๊ด๋ฆฌ | .env or Vault, ์ ๋ ์ฝ๋์ ํฌํจํ์ง ์๊ธฐ |
| SSL/TLS | Keycloak ๋ฐ API ๋ชจ๋ HTTPS ํ์ |
| Token ์๋ช | Access 5~15๋ถ / Refresh 30๋ถ ์ดํ |
| Role/Scope ์ ๋ต | API๋ณ ์ต์ ๊ถํ ์ค๊ณ (RBAC ์์น) |
| Monitoring | Keycloak Admin Console + Grafana + Loki ์ฐ๋ |
| Backup | Realm Export JSON ์ฃผ๊ธฐ์ ๋ฐฑ์ |

Keycloak์ ๋จ์ํ โ๋ณด์ ์๋ฒโ๊ฐ ์๋๋ผ,
OAuth2์ OIDC๋ฅผ ํตํฉ ๊ด๋ฆฌ ๊ฐ๋ฅํ ํ๋ซํผ์ผ๋ก ์งํ์ํจ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
โ Single Sign-On (SSO)
โ Centralized Role Management
โ OAuth2 / OIDC / SAML ํตํฉ ์ง์
โ LDAP / AD ์ฐ๋
โ API Gateway์ ์ฐ๋ ์ฉ์ด (Kong, Nginx, Istio)
โ MFA / OTP / Social Login ํตํฉ
Keycloak์ ํตํด ์ฐ๋ฆฌ๋ โ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ง์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐโ์์ โํ๋์ ์ค์ ์ธ์ฆ ํ๋ธ๋ฅผ ๋๋ ๊ตฌ์กฐโ๋ก ๋ฐ์ ํ ์ ์๋ค.