본문 바로가기

Capstone-F5

Keycloak과 SpringBoot 로그인 로직 연동

Keycloak과 Spring Boot 로그인 로직 연동하기

이번 글에서는 Keycloak을 이용해 Spring Boot 애플리케이션에서 로그인 처리를 어떻게 구현하는지, 실제 로그인 요청부터 토큰 발급까지의 흐름을 예제 코드와 함께 설명합니다.


1. 전체 로그인 흐름

  1. 사용자가 로그인 폼 제출 (이메일, 비밀번호)
  2. Spring Boot 백엔드에서 Keycloak 토큰 발급 요청
  3. Keycloak이 access_token 발급
  4. 토큰을 클라이언트에 반환 및 이후 요청에 Authorization 헤더 포함

2. 로그인 요청 예시 (Postman)

POST /realms/your-realm/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded

client_id=your-client
&username=user01@example.com
&password=qwer1234
&grant_type=password

응답:

{
  "access_token": "eyJhbGci...",
  "expires_in": 300,
  "refresh_token": "eyJhbGci...",
  ...
}

3. Spring Boot에서 Keycloak 로그인 연동

3-1. AuthController

@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginDTO loginDto) {
    String token = keycloakService.getToken(loginDto);
    return ResponseEntity.ok(Map.of("token", token));
}

3-2. KeycloakService

public String getToken(LoginDTO dto) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap body = new LinkedMultiValueMap<>();
    body.add("client_id", "your-client");
    body.add("grant_type", "password");
    body.add("username", dto.getEmail());
    body.add("password", dto.getPassword());

    HttpEntity> request = new HttpEntity<>(body, headers);
    ResponseEntity response = restTemplate.postForEntity(
        "http://localhost:8080/realms/your-realm/protocol/openid-connect/token",
        request,
        Map.class);

    return response.getBody().get("access_token").toString();
}

4. 유의 사항

  • Keycloak 서버 주소: Docker 환경이면 호스트 주소를 주의해야 합니다.
  • grant_type: 반드시 password 사용
  • 클라이언트 설정: Keycloak Admin Console에서 Direct Access Grants 옵션 활성화