이 글에서 얻는 것

  • OAuth 2.0 흐름 마스터: “승인 코드 방식"이 왜 안전한지, 어떻게 Access Token을 받아오는지 그림으로 이해합니다.
  • Provider 설정: Google(OIDC 지원)과 Kakao/Naver(OIDC 미지원/커스텀) 설정의 차이를 배웁니다.
  • Spring Boot 설정: application.yml 몇 줄로 소셜 로그인을 끝내는 마법을 체험합니다.

1. OAuth 2.0 등장 배경

과거에는 앱이 사용자의 구글 비밀번호를 직접 받아서 저장했습니다. (미친 짓이죠 😱) OAuth는 “비밀번호를 공유하지 않고, 권한(열쇠)만 빌려주는” 프로토콜입니다.

핵심 용어

용어설명예시
Resource Owner정보 주인로그인하려는 사용자(나)
Client정보를 쓰려는 앱우리의 웹 서비스
Authorization Server권한 관리자Kakao 인증 서버
Resource Server정보 보관소Kakao API 서버 (프로필, 친구목록)

2. Authorization Code Grant (승인 코드 방식)

가장 표준적인 방식입니다.

sequenceDiagram
    participant User as 사용자
    participant Browser as 브라우저
    participant Client as 우리 서버 (Backend)
    participant AuthServer as 카카오 인증 서버
    
    User->>Browser: "카카오 로그인" 클릭
    Browser->>AuthServer: 1. 로그인 요청 (redirect_uri 포함)
    AuthServer-->>User: 로그인 페이지 노출
    User->>AuthServer: ID/PW 입력 및 동의
    
    AuthServer-->>Browser: 2. 302 Redirect (with Code)
    Browser->>Client: 3. GET /login/oauth2/code/kakao?code=ABCD
    
    Client->>AuthServer: 4. Code 주고 Access Token 요청 (Back-Channel)
    AuthServer-->>Client: 5. Access Token (+ Refresh Token) 발급
    
    Client->>Client: 로그인 처리 (JWT 발급 등)
    Client-->>Browser: 로그인 성공 응답

핵심 포인트:

  • **Code(ABCD)**는 일회용입니다.
  • Access Token은 브라우저를 거치지 않고 서버끼리(Back-Channel) 주고받으므로 안전합니다.

3. Spring Security OAuth2 Client 설정

build.gradle:

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

application.yml:

spring:
  security:
    oauth2:
      client:
        registration:
          google: # OIDC 지원 (설정 간단)
            client-id: "YOUR_GOOGLE_ID"
            client-secret: "YOUR_GOOGLE_SECRET"
            scope:
              - email
              - profile
          
          kakao: # 커스텀 Provider 필요
            client-id: "YOUR_KAKAO_ID"
            client-secret: "YOUR_KAKAO_SECRET"
            client-authentication-method: client_secret_post
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope:
              - profile_nickname
              - account_email
            client-name: Kakao
            
        provider:
          kakao:
            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

4. OIDC (OpenID Connect) vs OAuth 2.0

  • OAuth 2.0: “권한 허가” (Authorization) 목적. (이 글쓰기 권한 줄게)
  • OIDC: “신원 인증” (Authentication) 목적. (너 철수 맞지?)
    • 구글 로그인은 Access Token과 함께 **ID Token(JWT)**을 줍니다. 이를 까보면 유저 정보가 들어있습니다.

요약

  1. Authorization Code 방식이 표준입니다. (프론트엔드에 토큰 노출 X)
  2. Spring Boot는 oauth2-client 의존성만 있으면 복잡한 핸드셰이크를 자동화해줍니다.
  3. 카카오/네이버 같은 국내 서비스는 provider 정보를 수동으로 입력해야 합니다.