TIL - 20250910

juni·2025년 9월 10일

TIL

목록 보기
121/317

0910 Spring: OAuth 2.0 (Kakao Login) and Environment Configuration


✅ 1. Spring Boot와 OAuth 2.0: 카카오 로그인 구현

  • 소셜 로그인(Social Login)이란 사용자가 기존에 사용하던 소셜 미디어 계정(카카오, 구글, 네이버 등)을 통해 우리 서비스에 간편하게 로그인하는 기능입니다. 이 과정의 표준적인 인증 프로토콜이 바로 OAuth 2.0입니다.

➕ OAuth 2.0의 핵심 동작 원리 (개념)

  • OAuth 2.0은 사용자의 비밀번호를 우리 서버가 직접 받지 않고, 신뢰할 수 있는 인증 서버(카카오)로부터 인증을 위임받는 방식입니다. 전체 흐름은 다음과 같습니다.
  1. [사용자] → [우리 서비스]: 사용자가 "카카오로 로그인" 버튼을 클릭합니다.
  2. [우리 서비스] → [카카오 서버]: 우리 서비스는 사용자를 카카오의 로그인 및 동의 화면으로 리다이렉트(Redirect)시킵니다.
  3. [사용자] ↔ [카카오 서버]: 사용자는 카카오 계정으로 로그인하고, 우리 서비스가 특정 정보(이메일, 닉네임 등)에 접근하는 것을 동의(Consent)합니다.
  4. [카카오 서버] → [우리 서비스]: 카카오 서버는 사용자를 우리 서비스가 미리 지정한 리다이렉트 URI로 다시 돌려보냅니다. 이때 URL에 임시 "인가 코드(Authorization Code)"를 포함시켜 전달합니다.
  5. [우리 서비스] ↔ [카카오 서버] (서버 간 통신): 우리 서버는 백엔드에서 이 인가 코드와 함께, 미리 발급받은 Client ID, Client Secret을 카카오 인증 서버로 보냅니다.
  6. [카카오 서버] → [우리 서비스]: 카카오 서버는 모든 정보가 유효하면, 실제 사용자 정보에 접근할 수 있는 "액세스 토큰(Access Token)"을 우리 서버에 발급해줍니다.
  7. [우리 서비스] → [카카오 서버]: 우리 서버는 발급받은 액세스 토큰을 사용하여 카카오 리소스 서버에 사용자 정보(이메일, 닉네임 등)를 요청합니다.
  8. [우리 서비스]: 사용자 정보를 성공적으로 받아온 후, 우리 서비스는 다음을 수행합니다.
    • (회원가입) 해당 이메일이 DB에 없으면, 자동으로 회원가입 처리.
    • (로그인) DB에 정보가 있으면, 로그인 처리.
    • 마지막으로, 우리 서비스만의 독자적인 인증 토큰(JWT)을 생성하여 클라이언트(React)에게 전달합니다.
  • Spring Boot의 역할: spring-boot-starter-oauth2-client 의존성을 사용하면, 위와 같은 복잡한 OAuth 2.0 흐름의 상당 부분을 자동화하고 간편하게 설정할 수 있습니다.

✅ 2. 환경 변수(Environment Variables) 설정 (.env)

  • 문제점: 데이터베이스 비밀번호, JWT 시크릿 키, OAuth Client Secret과 같은 민감한 정보를 application.yml 파일에 직접 작성하고 Git에 커밋하는 것은 심각한 보안 사고로 이어질 수 있습니다.

  • 해결책 (설정의 분리): 코드와 설정을 분리하는 원칙에 따라, 민감한 정보는 코드 외부의 환경 변수를 통해 주입받아야 합니다. .env 파일은 개발 환경에서 이러한 환경 변수를 손쉽게 관리하기 위한 방법입니다.

➕ Spring Boot에서 .env 파일 사용하기

  • Spring Boot는 기본적으로 .env 파일을 직접 읽지 않으므로, 별도의 라이브러리(e.g., java-dotenv)를 사용하여 이 기능을 활성화할 수 있습니다.
  1. 의존성 추가: build.gradleio.github.cdimascio:java-dotenv 라이브러리를 추가합니다.
  2. .env 파일 생성: 프로젝트의 루트 디렉토리에 .env 파일을 생성하고, 민감한 정보를 KEY=VALUE 형식으로 저장합니다.
    # .env
    DB_USERNAME=myuser
    DB_PASSWORD=mypassword
    KAKAO_CLIENT_ID=abcdefg12345
    KAKAO_CLIENT_SECRET=hijklmn67890
  3. .gitignore에 등록: 가장 중요한 단계입니다. .env 파일이 Git에 커밋되지 않도록 .gitignore 파일에 반드시 추가합니다.
    # .gitignore
    .env
  4. 애플리케이션에 로드: Spring Boot 애플리케이션의 메인 메서드에서, 앱이 실행되기 전에 .env 파일을 로드하도록 설정합니다.
  5. application.yml에서 참조: 이제 application.yml 파일에서 ${KEY} 구문을 사용하여 .env 파일에 정의된 값을 안전하게 참조할 수 있습니다.
    # application.yml
    spring:
      datasource:
        username: ${DB_USERNAME}
        password: ${DB_PASSWORD}
      security:
        oauth2:
          client:
            registration:
              kakao:
                client-id: ${KAKAO_CLIENT_ID}
                client-secret: ${KAKAO_CLIENT_SECRET}
  • 장점:
    • 보안: 민감한 정보가 소스 코드에서 완전히 분리됩니다.
    • 유연성: 개발, 테스트, 운영 등 각 환경마다 다른 설정값을 가진 .env 파일을 사용하거나 실제 시스템 환경 변수를 사용하여 유연하게 서버를 운영할 수 있습니다.

📌 요약

  • 카카오 로그인OAuth 2.0 프로토콜을 기반으로, 우리 서비스가 사용자의 비밀번호를 직접 다루지 않고 카카오로부터 인증을 위임받는 안전한 방식입니다. 최종적으로 우리 서버는 자체 JWT를 발급하여 클라이언트와 통신합니다.
  • 카카오 로그인에 필요한 Client Secret과 같은 민감한 정보는 .env 파일을 통해 환경 변수로 관리해야 합니다.
  • .env 파일은 .gitignore에 반드시 추가하여 Git에 커밋되지 않도록 하고, application.yml에서는 ${...} 구문을 통해 이 값들을 안전하게 참조하여 코드와 설정을 분리하는 원칙을 지켜야 합니다.

0개의 댓글