Spring Boot 3와 Spring Security 6를 활용한 카카오 OAuth2 소셜 로그인 구현 방법을 단계별로 알아봅니다. OAuth2와 OIDC의 차이점부터 실제 구현까지 다룹니다.
최근 대부분의 서비스에서 소셜 로그인은 필수가 되었습니다. 사용자는 복잡한 회원가입 과정 없이 카카오, 네이버, 구글 계정으로 간편하게 로그인할 수 있고, 서비스 제공자는 인증 보안을 OAuth2 Provider에게 위임할 수 있습니다.
이 글에서는 Spring Boot 3와 Spring Security 6를 사용하여 카카오 소셜 로그인을 구현하는 방법을 다룹니다. 특히 OAuth2와 OIDC의 차이점, 그리고 왜 OIDC를 선택해야 하는지까지 설명합니다.
OAuth2(Open Authorization 2.0)는 권한 부여(Authorization) 프로토콜입니다. 사용자가 자신의 리소스(프로필, 이메일 등)에 대한 접근 권한을 제3자 애플리케이션에 부여할 수 있게 해줍니다.
[사용자] → [우리 서비스] → [카카오]
"카카오 프로필 정보 좀 볼게요"
↓
[카카오가 Access Token 발급]
↓
[Access Token으로 UserInfo API 호출]
OIDC(OpenID Connect)는 OAuth2 위에 구축된 인증(Authentication) 레이어입니다. OAuth2가 "이 사용자가 권한을 부여했다"만 알려준다면, OIDC는 "이 사용자가 누구인지"까지 표준화된 방식으로 알려줍니다.
[사용자] → [우리 서비스] → [카카오]
"카카오로 로그인할게요"
↓
[카카오가 ID Token + Access Token 발급]
↓
[ID Token에서 바로 사용자 정보 추출]
| 구분 | OAuth2 | OIDC |
|---|---|---|
| 목적 | 권한 부여 (Authorization) | 인증 (Authentication) |
| 토큰 | Access Token만 발급 | ID Token + Access Token |
| 사용자 정보 | UserInfo API 별도 호출 필요 | ID Token에 포함 |
| 표준화 | 사용자 정보 포맷 비표준 | 표준화된 Claims (sub, email, name) |
| 보안 | 토큰 검증 어려움 | JWT 서명 검증 가능 |
sub, email, name 등 표준화된 필드로 Provider 간 일관성을 유지합니다.Tip: 카카오는 OIDC를 지원하므로, 반드시
openidscope를 추가하여 ID Token을 받아야 합니다.
dependencies {
// Spring Boot 3.x
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
// OAuth2 Client (필수)
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
// OAuth2 Resource Server (JWT 검증용, 선택)
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
}
spring:
security:
oauth2:
client:
registration:
kakao:
client-id: ${KAKAO_CLIENT_ID} # 카카오 REST API 키
client-secret: ${KAKAO_CLIENT_SECRET} # 보안 → Client Secret
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-authentication-method: client_secret_post
scope:
- openid # OIDC 필수!
- profile_nickname
- profile_image
- account_email
- phone_number
client-name: Kakao
provider:
kakao:
issuer-uri: https://kauth.kakao.com
authorization-uri: https://kauth.kakao.com/oauth/authorize
token-uri: https://kauth.kakao.com/oauth/token
user-info-uri: https://kapi.kakao.com/v2/user/me
user-name-attribute: id
| 항목 | 설명 |
|---|---|
client-id | 카카오 개발자센터의 REST API 키 |
client-secret | 카카오 보안 설정의 Client Secret 코드 |
redirect-uri | 인증 후 콜백 URL (Spring 기본값 사용) |
scope | 요청할 권한 범위 (openid 필수!) |
issuer-uri | OIDC Provider의 발급자 URI |
user-name-attribute | Principal name으로 사용할 속성 |
scope:
- openid # OIDC ID Token 발급 (필수)
- profile_nickname # 닉네임
- profile_image # 프로필 이미지
- account_email # 이메일
- phone_number # 전화번호 (비즈앱 필요)
- name # 실명 (비즈앱 필요)
주의:
phone_number와namescope는 카카오 비즈니스 앱에서만 사용 가능합니다.
앱 설정 → 앱 키에서 REST API 키를 복사합니다. 이것이 client-id입니다.
보안 메뉴에서:
카카오 로그인 메뉴에서:
카카오 로그인 → Redirect URI에 다음을 등록합니다:
http://localhost:8080/login/oauth2/code/kakao
https://your-domain.com/login/oauth2/code/kakao
동의항목 메뉴에서 필요한 정보의 동의 수준을 설정합니다:
| 항목 | 권장 설정 |
|---|---|
| 닉네임 | 필수 동의 |
| 프로필 사진 | 선택 동의 |
| 카카오계정(이메일) | 선택 동의 |
| 카카오계정(전화번호) | 비즈앱 전용 |

Spring Security OAuth2 Client는 다음 엔드포인트를 자동으로 생성합니다:
| 엔드포인트 | 설명 |
|---|---|
/oauth2/authorization/{registrationId} | OAuth2 인증 시작 |
/login/oauth2/code/{registrationId} | OAuth2 콜백 (Authorization Code 수신) |
# 1. 프론트엔드에서 로그인 버튼 클릭 시
GET /oauth2/authorization/kakao?redirect_uri=/mypage
# 2. 카카오 인증 후 콜백
GET /login/oauth2/code/kakao?code=xxx&state=yyy
# 3. 인증 성공 후 프론트엔드로 리다이렉트
GET /oauth2/callback?redirect_uri=/mypage
이번 글에서는 Spring Boot 3에서 카카오 OAuth2 소셜 로그인을 구현하기 위한 기초를 다뤘습니다. OAuth2와 OIDC의 차이점을 이해하고, 의존성 설정부터 카카오 개발자센터 설정까지 단계별로 진행했습니다.
가능하면 OIDC를 선택하세요openid 스코프를 추가하면 ID Token을 통해 사용자 정보를 안전하고 빠르게 얻을 수 있습니다 (JWT 서명 지원).
보안 설정은 꼼꼼하게
client-secret-post (본문 포함), 그 외는 보통 client-secret-basic (헤더 포함) 방식을 사용하므로 설정 시 주의가 필요합니다.openid는 필수입니다.