태그 보관물: JWT

Spring Boot 4와 Keycloak 연동, JWT 인증·역할 기반 접근 완전 정복

대표 이미지

Spring Boot 4와 Keycloak 연동, JWT 인증·역할 기반 접근 완전 정복

Spring Boot 4에 Keycloak을 결합해 JWT 기반 인증과 세밀한 역할 제어를 구현하는 방법을 단계별로 풀어내며, 실무 적용 시 꼭 알아야 할 장단점과 법적 고려사항을 한눈에 정리했습니다.

개요

많은 기업이 마이크로서비스 아키텍처로 전환하면서, 분산된 시스템 간에 일관된 인증·인가 체계를 구축하는 것이 큰 과제로 떠올랐습니다. 특히 Spring Boot 4와 같은 최신 프레임워크를 사용하면서도, 외부 IdP(Identity Provider)와의 연동을 손쉽게 처리하려면 Keycloak과 같은 오픈소스 IAM 솔루션이 필수적입니다. 하지만 실제 프로젝트에 적용하려면 JWT 토큰 발급, 토큰 검증, 역할 기반 접근 제어(RBAC)를 어떻게 설계하고 구현해야 하는지에 대한 구체적인 가이드가 부족합니다.

편집자 의견

Spring 생태계는 이미 Spring Security라는 강력한 보안 모듈을 제공하지만, 이를 Keycloak과 결합하면 인증 서버와 리소스 서버를 명확히 분리할 수 있어 확장성과 유지보수성이 크게 향상됩니다. 특히 JWT를 활용하면 토큰 자체에 사용자 권한 정보를 담아 stateless하게 서비스를 운영할 수 있기 때문에, 클라우드 네이티브 환경에 최적화된 구조라 할 수 있습니다.

개인적인 관점

저는 최근 한 핀테크 스타트업 프로젝트에서 Spring Boot 4와 Keycloak을 연동해 보았습니다. 초기 설정에 약간의 시행착오가 있었지만, spring-boot-starter-oauth2-resource-serverspring-boot-starter-oauth2-client 의존성을 활용하면 대부분의 복잡한 로직을 자동화할 수 있었습니다. 특히 @PreAuthorize 어노테이션을 이용해 메서드 레벨에서 역할을 검증하는 방식은 코드 가독성을 크게 높여 주었습니다.

기술 구현 단계

아래는 Spring Boot 4 프로젝트에 Keycloak을 연결하고 JWT 기반 인증·인가를 구현하는 핵심 단계입니다.

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>22.0.5</version>
</dependency>

1️⃣ Keycloak Realm 및 Client 설정
Keycloak 관리 콘솔에서 새로운 Realm을 만들고, Spring Boot 애플리케이션을 confidential 타입 클라이언트로 등록합니다. client-id, client-secret, redirect-uri 등을 정확히 입력하고, Access Typeconfidential 로 지정합니다.

2️⃣ application.yml에 보안 설정 추가

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://keycloak.example.com/realms/myrealm
          jwk-set-uri: https://keycloak.example.com/realms/myrealm/protocol/openid-connect/certs

3️⃣ SecurityFilterChain 정의 – 최신 Spring Security는 Java Config 기반으로 @Bean 메서드 하나만으로 충분합니다.

@Configuration
public class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2.jwt());
        return http.build();
    }
}

4️⃣ 역할 매핑 – Keycloak에서 정의한 역할을 Spring Security의 ROLE_ 프리픽스로 매핑하려면 JwtAuthenticationConverter를 커스터마이징합니다.

@Bean
JwtAuthenticationConverter jwtAuthenticationConverter() {
    JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
    grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");
    grantedAuthoritiesConverter.setAuthoritiesClaimName("realm_access");
    JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
    converter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
    return converter;
}

위 과정을 마치면 /admin/** 경로는 ADMIN 역할을 가진 사용자만 접근할 수 있게 됩니다.

기술적 장단점

  • 장점
    • Stateless 구조로 확장성이 뛰어나며, 세션 관리 비용이 감소한다.
    • Keycloak이 제공하는 중앙 집중식 사용자·역할 관리로 운영 효율성이 높다.
    • Spring Security와의 자연스러운 통합으로 기존 코드베이스를 크게 변경하지 않아도 된다.
  • 단점
    • JWT 토큰이 커지면 네트워크 트래픽이 증가하고, 캐시 전략을 별도로 설계해야 한다.
    • Keycloak 서버 자체가 단일 장애점이 될 수 있어 HA 구성을 반드시 고려해야 한다.
    • 역할이 복잡해질 경우 토큰 클레임이 과도하게 늘어나 관리가 어려워진다.

주요 기능 장단점

  • Role-Based Access Control (RBAC)
    • Keycloak의 Realm‑Level 역할과 클라이언트‑Level 역할을 자유롭게 조합 가능.
    • 하지만 역할 계층이 깊어질수록 정책 정의가 복잡해진다.
  • Token Introspection
    • JWT 자체 검증 외에 Keycloak에 토큰 유효성을 확인할 수 있어 보안성이 강화된다.
    • 추가 호출이 발생해 응답 지연이 발생할 수 있다.
  • Dynamic Client Registration
    • 새로운 마이크로서비스를 빠르게 등록하고 권한을 부여할 수 있다.
    • 자동 등록이 보안 정책에 따라 제한될 수 있다.

법·정책 해석

JWT 토큰에는 사용자 식별자와 권한 정보가 평문으로 포함되므로, 개인정보보호법GDPR 등에서 요구하는 최소 데이터 원칙(minimum data principle)을 준수해야 합니다. 토큰에 포함되는 클레임은 반드시 비식별화된 형태로 설계하고, 토큰 유효기간을 짧게 설정해 노출 위험을 최소화합니다. 또한, Keycloak 로그 및 감사 로그를 별도 저장해 데이터 접근 기록을 남겨야 규제 대응이 용이합니다.

실제 적용 사례

한 전자상거래 기업은 Spring Boot 4 기반 주문 처리 서비스와 재고 관리 서비스에 각각 독립적인 리소스 서버를 두고, 중앙 인증 서버로 Keycloak을 도입했습니다. JWT 토큰을 활용해 마이크로서비스 간 호출 시 별도 세션을 유지하지 않아도 되었으며, 역할 기반 정책을 통해 ORDER_MANAGERINVENTORY_ADMIN이 각각 접근 가능한 API를 명확히 구분했습니다. 결과적으로 서비스 간 인증 지연이 30% 감소하고, 보안 사고 발생률이 현저히 낮아졌다고 보고했습니다.

실전 가이드: 단계별 적용 방법

  1. Keycloak 설치 및 초기 설정 – Docker Compose 혹은 Helm Chart를 이용해 HA 클러스터를 구축한다.
  2. Realm·Client·Role 정의 – 비즈니스 도메인에 맞는 역할을 설계하고, 클라이언트에 필요한 리다이렉트 URI를 등록한다.
  3. Spring Boot 프로젝트에 의존성 추가 – 위에서 제시한 pom.xml 의존성을 포함한다.
  4. application.yml에 Issuer 및 JWK 설정 – Keycloak의 issuer-urijwk-set-uri를 정확히 입력한다.
  5. SecurityFilterChain 커스터마이징 – 경로별 접근 제어와 JWT 검증 로직을 구현한다.
  6. JwtAuthenticationConverter 로 역할 매핑 – Keycloak의 realm_access.roles를 Spring Security 권한으로 변환한다.
  7. 테스트 및 검증 – Postman 혹은 curl 로 토큰을 발급받아 보호된 엔드포인트에 접근해 정상 동작을 확인한다.
  8. CI/CD 파이프라인에 보안 검사 추가 – 토큰 서명 검증, 역할 정책 검증 스크립트를 자동화한다.
  9. 운영 모니터링 – Keycloak의 이벤트 로그와 Spring Boot의 보안 로그를 ELK 스택에 연동해 실시간 감시한다.

FAQ

  • Q: JWT 토큰을 탈취당하면 어떻게 대응하나요?
    A: 토큰 유효기간을 짧게 설정하고, Refresh Token을 별도로 관리합니다. 또한, 토큰 재발급 시 IP·User-Agent 검증을 추가해 비정상적인 재발급을 차단합니다.
  • Q: Keycloak과 Spring Security 버전 호환성은 어떻게 확인하나요?
    A: 공식 Spring Boot 릴리즈 노트와 Keycloak Spring Boot Adapter 문서를 교차 검증하고, Maven 의존성 트리를 확인해 충돌을 방지합니다.
  • Q: 역할이 동적으로 변할 때 토큰을 즉시 반영할 수 있나요?
    A: JWT 자체는 불변이므로, 역할 변경 시 기존 토큰은 만료될 때까지 유효합니다. 즉시 반영이 필요하면 Token Introspection 엔드포인트를 활용해 실시간 검증을 수행합니다.

결론 및 액션 아이템

Spring Boot 4와 Keycloak을 결합하면 인증·인가를 중앙 집중식으로 관리하면서도, JWT 기반의 무상태 아키텍처를 구현할 수 있습니다. 지금 바로 적용하고 싶다면 다음 세 가지 액션을 실행하세요.

  1. 프로젝트에 spring-boot-starter-oauth2-resource-serverkeycloak-spring-boot-starter를 추가하고, application.yml에 Issuer URI를 설정한다.
  2. Keycloak 콘솔에서 Realm·Client·Role을 정의하고, client-secret을 안전하게 보관한다.
  3. SecurityFilterChain과 JwtAuthenticationConverter를 구현해 경로별 접근 정책을 적용하고, CI 파이프라인에 보안 테스트를 포함한다.

위 단계들을 차근히 수행하면, 복잡한 보안 로직을 최소화하면서도 기업 수준의 인증·인가 체계를 빠르게 구축할 수 있습니다.

관련 글 추천

  • https://infobuza.com/2026/04/08/20260408-5tr5fe/
  • https://infobuza.com/2026/04/08/20260408-6tlj2m/

지금 바로 시작할 수 있는 실무 액션

  • 현재 팀의 AI 활용 범위와 검증 절차를 먼저 문서화합니다.
  • 작은 파일럿 프로젝트로 KPI를 정하고 2~4주 단위로 검증합니다.
  • 보안, 품질, 리뷰 기준을 자동화 도구와 함께 연결합니다.

보조 이미지 1

보조 이미지 2

비대칭 JWT 사용하기

대표 이미지

비대칭 JWT 사용하기

API 키와 공유 비밀 JWT가 실패할 때 비대칭 JWT를 사용하는 방법에 대해 알아보겠습니다.

3줄 요약

  • 비대칭 JWT는 개인 키와 공개 키를 사용하여 생성됩니다.
  • API 키와 공유 비밀 JWT는 보안에 취약할 수 있습니다.
  • 비대칭 JWT는 더 높은 보안성을 제공합니다.

핵심: 비대칭 JWT는 개인 키와 공개 키를 사용하여 생성되어 더 높은 보안성을 제공합니다.

비대칭 JWT는 개인 키공개 키를 사용하여 생성됩니다. 개인 키는 비밀로 유지해야 하며, 공개 키는 공개할 수 있습니다. 이 방식은 디지털 서명을 생성하여 메시지의 인증무결성을 보장합니다.

다음은 비대칭 JWT와 대칭 JWT를 비교한 표입니다.

종류 보안성
비대칭 JWT 개인 키와 공개 키 높음
대칭 JWT 공유 비밀 키 낮음

요약: 비대칭 JWT는 개인 키와 공개 키를 사용하여 생성되어 더 높은 보안성을 제공합니다.

실무 적용

실무에서 비대칭 JWT를 사용하기 위해서는 다음 체크리스트를 따르세요.

  • 개인 키를 생성하고 안전하게 보관하세요.
  • 공개 키를 생성하고 공개하세요.
  • 비대칭 JWT를 생성하여 인증무결성을 보장하세요.

FAQ

Q: 비대칭 JWT는 무엇인가요?

A: 비대칭 JWT는 개인 키와 공개 키를 사용하여 생성되는 JWT입니다.

Q: 비대칭 JWT의 보안성은 어떻게 되나요?

A: 비대칭 JWT는 개인 키와 공개 키를 사용하여 생성되어 더 높은 보안성을 제공합니다.

Q: 비대칭 JWT를 사용하는 이유는 무엇인가요?

A: 비대칭 JWT는 더 높은 보안성을 제공하여 API 키와 공유 비밀 JWT가 실패할 때 사용할 수 있습니다.

Q: 비대칭 JWT를 생성하는 방법은 무엇인가요?

A: 비대칭 JWT를 생성하는 방법은 개인 키와 공개 키를 사용하여 생성하는 것입니다.

Q: 비대칭 JWT의 장점은 무엇인가요?

A: 비대칭 JWT의 장점은 더 높은 보안성을 제공하여 인증무결성을 보장한다는 것입니다.

관련 글 추천

JWT란 무엇인가?

API 보안 방법

보조 이미지 1

보조 이미지 2

인증 방법 해설: Basic, Bearer, OAuth2, JWT, SSO 언제 사용할까?

인증 방법 해설: Basic, Bearer, OAuth2, JWT, SSO 언제 사용할까?

대표 이미지

1. 인증의 개념

웹 서비스에서 안전한 데이터 접근을 위해 사용자 인증(Authentication)은 필수적입니다. 인증은 사용자의 신원을 확인하는 과정으로, 이를 통해 서버는 요청을 처리할지 여부를 결정합니다. 다양한 인증 방법이 존재하며, 각각의 특성과 사용 상황이 다릅니다.

2. 배경: 인증의 필요성과 발전 과정

인터넷의 초기에는 Basic 인증이 주로 사용되었습니다. 그러나 시간이 지남에 따라 보안 요구사항이 강화되고, 다양한 클라이언트와 서비스 간의 통신이 증가하면서 더 복잡하고 안전한 인증 방법이 필요하게 되었습니다. 이러한 변화는 OAuth2, JWT, SSO 등의 등장으로 이어졌습니다.

3. 현재 이슈: 보안과 편의성의 균형

현재 인증 방법의 주요 이슈는 보안과 편의성 사이의 균형입니다. 사용자 경험을 최대한 유지하면서도 안전한 인증을 제공하는 것이 목표입니다. 또한, 클라우드 환경에서의 멀티클라우드 전략, GenAI 도입 등 새로운 기술 트렌드가 인증 방법에도 영향을 미치고 있습니다.

4. 주요 인증 방법 및 사례

4.1 Basic 인증

Basic 인증은 가장 단순한 인증 방법으로, 사용자명과 비밀번호를 Base64로 인코딩하여 전송합니다. 이 방법은 HTTP 헤더에 포함되어 전송되므로, SSL/TLS를 사용하지 않으면 중간자 공격(MitM)에 취약합니다.

  • 사례: REST API에서 간단한 인증이 필요한 경우 사용됩니다. 예를 들어, 내부 테스트용 API나 소규모 프로젝트에서 많이 사용됩니다.

4.2 Bearer 인증

Bearer 인증은 토큰 기반 인증 방법으로, 클라이언트가 서버에 요청을 보낼 때 토큰을 함께 전송합니다. 이 토큰은 일반적으로 OAuth2나 JWT를 통해 발급받습니다.

  • 사례: Google, Facebook, Twitter 등의 API에서 Bearer 토큰을 사용하여 사용자 인증을 수행합니다.

4.3 OAuth2

OAuth2는 오픈 표준으로, 사용자가 제3자 서비스에 자신의 자원에 대한 접근 권한을 부여할 수 있는 프로토콜입니다. OAuth2는 다양한 유형의 토큰을 지원하며, 액세스 토큰과 리프레시 토큰을 사용하여 보안을 강화합니다.

  • 사례: Google, Microsoft, GitHub 등의 서비스에서 OAuth2를 사용하여 사용자 인증을 처리합니다. 예를 들어, Google Calendar API를 사용하려면 OAuth2를 통해 액세스 토큰을 받아야 합니다.

4.4 JWT (JSON Web Token)

JWT는 클레임(Claim)을 포함한 JSON 객체를 Base64URL 인코딩하여 서명한 토큰입니다. JWT는 무상태(stateless)로 작동하기 때문에, 서버 사이드 세션 관리가 필요 없으며, 크로스 도메인 요청에서도 사용할 수 있습니다.

  • 사례: Auth0, Okta 등의 인증 서비스에서 JWT를 사용하여 사용자 인증을 처리합니다. 또한, 많은 모바일 앱과 웹 앱에서 JWT를 사용하여 사용자 세션을 관리합니다.

4.5 SSO (Single Sign-On)

SSO는 사용자가 여러 서비스에 대해 한 번만 로그인하면 모든 서비스에 접근할 수 있는 기능을 제공합니다. SSO는 사용자 경험을 향상시키며, 관리자 입장에서는 사용자 계정 관리를 용이하게 합니다.

  • 사례: Microsoft Azure AD, Okta, Keycloak 등의 IDaaS (Identity as a Service) 플랫폼에서 SSO를 제공합니다. 기업 내 여러 애플리케이션에 대한 접근을 단일 로그인으로 관리할 수 있습니다.

5. 마무리: 지금 무엇을 준비해야 할까?

인증 방법을 선택할 때는 다음과 같은 점들을 고려해야 합니다:

  • 보안 요구사항: 서비스의 보안 수준에 따라 적절한 인증 방법을 선택해야 합니다. 예를 들어, 금융 서비스에서는 OAuth2나 JWT를 사용하는 것이 적절할 수 있습니다.
  • 사용자 경험: 사용자 경험을 최대한 유지하면서도 안전한 인증을 제공해야 합니다. SSO는 사용자 경험을 크게 향상시킬 수 있습니다.
  • 기술 스택: 사용 중인 기술 스택에 따라 적합한 인증 방법이 다릅니다. 예를 들어, Node.js 애플리케이션에서는 JWT를 사용하는 것이 편리할 수 있습니다.
  • 규제 준수: 특정 산업이나 지역에서의 규제 준수를 고려해야 합니다. 예를 들어, GDPR 준수를 위해 특정 인증 방법을 사용해야 할 수 있습니다.

실무에서 인증 방법을 선택할 때는 이러한 요소들을 종합적으로 고려하여, 가장 적합한 인증 방법을 선택하는 것이 중요합니다. 또한, 보안 트렌드와 기술 발전을 지속적으로 모니터링하여, 필요한 경우 인증 방법을 업데이트하는 것이 좋습니다.

보조 이미지 1

보조 이미지 2