삶 가운데 남긴 기록 AACII.TISTORY.COM

스프링 부트 웹 애플리케이션에서 카카오 로그인 처리 본문

DEV&OPS/Java

스프링 부트 웹 애플리케이션에서 카카오 로그인 처리

ALEPH.GEM 2026. 7. 16. 10:07
728x90

 

카카오 로그인 설정

우선 카카오 계정이 필요합니다.

카카오 로그인 준비를 위해서 카카오 디벨로퍼 사이트에 가서 로그인합니다.(카카오 계정으로 로그인됩니다.)

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

로그인 한 뒤 상단에 앱 메뉴를 누르고 + 앱 생성 버튼을 클릭합니다.

필수 입력 정보를 입력한 뒤 저장 버튼을 누르면 앱이 추가됩니다.

방금 추가한 앱을 눌러보면 좌측에 메뉴가 나오는데

 

앱 > 플랫폼 키 메뉴로 들어갑니다.

이 중 REST API키는 따로 보관해 둡니다.

REST API키 항목 근처에 클라이언트 시크릿 버튼을 누릅니다.

카카오 로그인 리다이렉트 URI를 설정해 줍니다.

예) http://localhost:8080/login/oauth2/code/kakao 

필요한 정보를 입력하고 카카오 로그인 클라이언트 시크릿 코드를 따로 보관해 둡니다.

 

다시 좌측 메뉴에서

제품 설정 > 카카오 로그인 > 일반 메뉴로 들어갑니다.

카카오 로그인의 사용여부를 ON으로 바꿉니다.

제품설정 > 카카오 로그인 > 고급 메뉴로 들어갑니다.

로그아웃 리다이렉트 URI를 등록합니다.

제품설정 > 카카오 로그인 > 동의항목 메뉴로 들어갑니다.

여기에서 개인 정보 항목에서 닉네임 항목의 설정 버튼을 누르고 동의 설정을 합니다.

이때 닉네임 항목의 ID 값이 보통 profile_nickname인데 이 것은 아래에서 application.properties에서 사용합니다.

 

build.gradle

스프링 시큐리티와 OAuth2 클라이언트가 필요합니다.

    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

 

 

OAuth2

대부분의 소셜 로그인은 OAuth2 방식으로 처리합니다.

OAuth2는 문자열 토큰을 주고받는 방식으로 토큰을 발행하거나 검사하는 방식을 통해서 서비스 간 데이터를 교환합니다.

OAuth2는 기존 OAuth 보다 단순해진 형태로 통신합니다.

1. 애플리케이션이 /oauth/authorize로부터 위에서 받은 REST API키를 통해 인가 코드를 받습니다.

2. 인가 코드는 위에서 리다이렉트 URI로 저장한 곳으로 전달됩니다. 스프링 부트의 OAuth2 client를 사용하는 경우 리다이렉트 URI는 정해진 패턴을 사용합니다. 이 인가 코드https://kauth.kakao.com/oauth/token 에서 자신의 비밀키(클라이언트 시크릿)와 같이 사용되어 액세스 토큰을 생성할 때 사용됩니다. 엑세스 토큰이 외부에 탈취당하면 위험하기 때문에 유효기간을 짧게 설정합니다.

3. 애플리케이션이 카카오로부터 엑세스 토큰을 받으면 https://kapi.kakao.com/v2/user/me 으로 사용자 정보를 요청합니다. 이때 사용자가 동의했던 정보(이메일)들을 얻어옵니다.

 

 

application.properties

스프링 부트의 application.properties에 다음과 같은 설정들을 추가해 줍니다.

spring.security.oauth2.client.provider.kakao.authorization-uri=https://kauth.kakao.com/oauth/authorize
spring.security.oauth2.client.provider.kakao.user-name-attribute=id
spring.security.oauth2.client.provider.kakao.token-uri=https://kauth.kakao.com/oauth/token
spring.security.oauth2.client.provider.kakao.user-info-uri=https://kapi.kakao.com/v2/user/me
spring.security.oauth2.client.registration.kakao.client-name=kakao
spring.security.oauth2.client.registration.kakao.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.kakao.redirect-uri=등록했던 로그인 리다이렉트 주소
spring.security.oauth2.client.registration.kakao.client-id=발급받은 REST 키
spring.security.oauth2.client.registration.kakao.client-secret=발급받은 클라이언트 시크릿 키
spring.security.oauth2.client.registration.kakao.client-authentication-method=client_secret_post
spring.security.oauth2.client.registration.kakao.scope=profile_nickname

발급받은 키들은 유출되지 않도록 잘 관리해야 합니다.

여기서 scope 항목은 카카오에서 카카오 로그인 > 동의항목 메뉴의 개인정보에 적혀있던 동의 항목들의 ID 값들을 콤마를 구분자로 적어줍니다. (예: 닉네임은 profile_nickname)

아래 사진 윗부분 추가 기능 신청에서 사업자 정보를 등을 제공하면 카카오계정(이메일) 주소등도 설정해서 활용할 수 있습니다.

 

제품설정 > 카카오 로그인 > 동의항목

 

위 동의항목의 개인정보 항목의 ID 값들 중에서 설정 버튼으로 동의하지 않은 ID 값을

spring.security.oauth2.client.registration.kakao.scope=동의한ID값1,동의한ID값2,동의한ID값3

값에 적으면 로그인 시 에러가 발생합니다.

 

 

커스텀 된 시큐리티 설정

스프링 시큐리티 설정 파일이 CustomSecurityConfig.java라고 가정하면 여기에 oauth2Login()을 추가합니다.

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
    
        ... 생략
        
        http.oauth2Login(oauth2 -> oauth2.loginPage("/커스텀된로그인페이지주소")); 
        return http.build();
    }

 

그다음 로그인 페이지에 링크를 추가합니다.

이 링크는 OAuth2 Client 가 자동으로 생성되는 링크입니다.

<div>
    <a href="/oauth2/authorization/kakao">KAKAO 로그인</a>
</div>

 

 

CustomOauth2UserService 클래스 생성

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
import java.util.Map;

@Log4j2
@Service
@RequiredArgsConstructor
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException{
        ClientRegistration clientRegistration = userRequest.getClientRegistration();
        String clientName = clientRegistration.getClientName();
        log.info("[clientName]" + clientName);
        OAuth2User oAuth2User = super.loadUser(userRequest);
        Map<String, Object> paramMap = oAuth2User.getAttributes();
        paramMap.forEach((key, value) -> {
           log.info("-------------------------------------------");
           log.info("key: " + key + " value: " + value);
        });
        
        Object properties = paramMap.get("properties");
        LinkedHashMap propertiesMap = (LinkedHashMap) properties;
        String nickname = (String) propertiesMap.get("nickname");
        log.info("[nickname]" + nickname);
        return oAuth2User;
    }
}

 

이제 이 카카오(소셜) 로그인 인증 정보를 활용해서 서비스에서 이용하면 됩니다.

 

 

 

 

 

 

 

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

JPA 연관 관계  (0) 2026.07.11
인텔리제이 주석 템플릿 설정  (0) 2026.07.06
FreeMarker 설정과 기본 사용법  (0) 2026.07.06
spring mvc / jsp 페이징 처리  (0) 2025.11.07
Spring MVC 다국어 처리  (0) 2025.11.05