프로젝트 🧸/CocO 🐤

[Spring Boot] Naver 소셜 로그인 구현: OAuth2.0 & Spring Security 활용 🐤

코양이🤍 2024. 9. 11. 16:55

구글 소셜 로그인과 카카오 소셜 로그인을 구현했던 이전글에 이어서 네이버 소셜 로그인을 구현해보도록 하겠습니다!

구글 소셜 로그인 구현 방법과 카카오 소셜 로그인 구현 방법은 아래 글에서 확인할 수 있습니다!

특히, 전체적인 코드 구조와 설명은 구글 소셜 로그인 글에서 확인하실 수 있으니 이 글을 위주로 이해하시면 될 거 같습니다!

 

[Spring Boot] Kakao 소셜 로그인 구현: OAuth2.0 & Spring Security 활용 🐤

구글 소셜 로그인을 구현했던 이전글에 이어서 카카오 소셜 로그인을 구현해보도록 하겠습니다.구글 소셜 로그인 구현 방법은 아래 글에서 확인할 수 있습니다 [Spring Boot] Google 소셜 로그인 구

blu-blu.tistory.com

 

 

[Spring Boot] Google 소셜 로그인 구현: OAuth2.0와 Spring Security를 활용한 완벽 가이드 🐤

소셜 로그인은 사용자에게 간편한 로그인 방법을 제공하고, 개발자는 사용자 인증을 쉽게 처리할 수 있는 방법입니다. 이번 글에서는 OAuth2.0와 Spring Security를 활용해 구글 소셜 로그인을 구현하

blu-blu.tistory.com


⭐ 코드 설명

✅ Service 폴더 - Social 폴더

☑️ NaverOauth.java 파일

package com.example.CocO.service.social;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
public class NaverOauth implements SocialOauth {
    @Value("${sns.naver.url}")
    private String NAVER_SNS_BASE_URL;
    @Value("${sns.naver.client.id}")
    private String NAVER_SNS_CLIENT_ID;
    @Value("${sns.naver.callback.url}")
    private String NAVER_SNS_CALLBACK_URL;
    @Value("${sns.naver.client.secret}")
    private String NAVER_SNS_CLIENT_SECRET;
    @Value("${sns.naver.token.url}")
    private String NAVER_SNS_TOKEN_BASE_URL;

    @Override
    public String getOauthRedirectURL() {
        Map<String, Object> params = new HashMap<>();
        params.put("response_type", "code");
        params.put("client_id", NAVER_SNS_CLIENT_ID);
        params.put("redirect_uri", NAVER_SNS_CALLBACK_URL);
        params.put("state", "random_state_value"); // CSRF 방지를 위한 state 파라미터 추가

        String parameterString = params.entrySet().stream()
                .map(x -> x.getKey() + "=" + x.getValue())
                .collect(Collectors.joining("&"));

        return NAVER_SNS_BASE_URL + "?" + parameterString;
    }

    @Override
    public String requestAccessToken(String code) {
        RestTemplate restTemplate = new RestTemplate();

        Map<String, Object> params = new HashMap<>();
        params.put("code", code);
        params.put("client_id", NAVER_SNS_CLIENT_ID);
        params.put("client_secret", NAVER_SNS_CLIENT_SECRET);
        params.put("redirect_uri", NAVER_SNS_CALLBACK_URL);
        params.put("grant_type", "authorization_code");
        params.put("state", "random_state_value");

        ResponseEntity<String> responseEntity = restTemplate.postForEntity(NAVER_SNS_TOKEN_BASE_URL, params, String.class);

        if (responseEntity.getStatusCode() == HttpStatus.OK) {
            return responseEntity.getBody();
        }
        return "네이버 로그인 요청 처리 실패";
    }
}

이 코드는 네이버 OAuth 2.0 기반으로 소셜 로그인을 구현한 NaverOauth 클래스입니다. 이 클래스는 SocialOauth 인터페이스를 구현하며, 네이버 로그인과 관련된 리다이렉트 URL 생성과 액세스 토큰을 요청하는 기능을 제공합니다. 스프링의 여러 어노테이션과 라이브러리를 사용하여 구성되었습니다. 주요 기능과 흐름을 설명하겠습니다.

주요 역할 및 구성 요소

  1. 클래스 어노테이션
    • @Component: 이 클래스는 스프링의 빈(Bean)으로 등록됩니다. 즉, 스프링 컨텍스트에서 이 클래스의 객체를 관리하게 됩니다.
    • @RequiredArgsConstructor: 이 어노테이션은 클래스 필드에 선언된 final 또는 @NonNull 필드를 위한 생성자를 자동으로 생성해줍니다. 하지만 이 코드에서는 생성자 주입을 사용하지 않고, @Value를 통해 설정값을 주입받고 있습니다.
  2. @Value 어노테이션
    • 네이버 소셜 로그인에 필요한 URL, 클라이언트 ID, 시크릿 키 등을 application.properties 또는 application.yml 파일에서 주입받습니다.
      • NAVER_SNS_BASE_URL: 네이버 소셜 로그인 요청을 위한 기본 URL.
      • NAVER_SNS_CLIENT_ID: 네이버 개발자 콘솔에서 발급받은 클라이언트 ID.
      • NAVER_SNS_CALLBACK_URL: 네이버 로그인 인증 후 리다이렉트할 콜백 URL.
      • NAVER_SNS_CLIENT_SECRET: 네이버 개발자 콘솔에서 발급받은 클라이언트 시크릿.
      • NAVER_SNS_TOKEN_BASE_URL: 네이버 소셜 로그인 액세스 토큰을 요청하는 URL.

메서드 설명

  1. getOauthRedirectURL()
    • 이 메서드는 네이버 로그인 인증 페이지로 리다이렉트하기 위한 URL을 생성합니다.
    • 파라미터 구성:
      • response_type: 네이버 로그인 서버가 반환할 응답 타입으로, "code"는 인증 코드를 요청한다는 의미입니다.
      • client_id: 네이버 개발자 콘솔에서 발급받은 클라이언트 ID.
      • redirect_uri: 인증 후 리다이렉트할 콜백 URL.
      • state: CSRF(사이트 간 요청 위조) 방지를 위한 임의의 문자열. 매 요청마다 다르게 설정하는 것이 보안에 좋습니다.
    • URL 생성: 파라미터들을 key=value 형식으로 변환한 후, &로 이어붙여 네이버 로그인 인증 요청 URL을 완성하여 반환합니다.
    • 반환값: 네이버 소셜 로그인 페이지로 리다이렉트할 URL.
  2. requestAccessToken(String code)
    • 네이버로부터 받은 인증 코드(code)를 이용해 액세스 토큰을 요청하는 메서드입니다.
    • 파라미터 구성:
      • code: 네이버에서 전달된 인증 코드.
      • client_id: 클라이언트 ID.
      • client_secret: 클라이언트 시크릿.
      • redirect_uri: 인증 후 리다이렉트할 URL.
      • grant_type: "authorization_code"는 OAuth 2.0 인증 방식 중 하나로, 인증 코드로 액세스 토큰을 발급받는 방식입니다.
      • state: CSRF 방지용으로 전달한 값.
    • HTTP 요청: RestTemplate을 이용하여 POST 요청을 보내고, 네이버 API에서 액세스 토큰을 반환받습니다.
      • postForEntity() 메서드를 사용하여 지정된 URL에 파라미터들을 담아 POST 요청을 보냅니다.
      • 요청에 성공하면, 서버에서 응답으로 액세스 토큰 정보를 포함한 JSON 데이터를 반환합니다.
    • 응답 처리:
      • 응답 상태 코드가 HttpStatus.OK이면 응답 본문을 반환합니다.
      • 그렇지 않으면 "네이버 로그인 요청 처리 실패"라는 오류 메시지를 반환합니다.

✅ Resources 폴더

☑️ application.properties 파일

 

sns.naver.url=https://nid.naver.com/oauth2.0/authorize
sns.naver.client.id=<네이버 개발자 센터에서 발급받은 클라이언트 ID>
sns.naver.client.secret=<네이버 개발자 센터에서 발급받은 secret>
sns.naver.callback.url=http://localhost:8080/auth/naver/callback
sns.naver.token.url=https://nid.naver.com/oauth2.0/token

⭐ 전체적인 흐름

  1. 리다이렉트 URL 생성: 사용자가 네이버 로그인을 요청하면 getOauthRedirectURL() 메서드가 호출되어 네이버 로그인 페이지로 리다이렉트할 URL을 생성합니다.
  2. 인증 코드 수신: 사용자가 네이버 로그인 페이지에서 로그인하면, 네이버는 해당 콜백 URL로 인증 코드를 전달합니다.
  3. 액세스 토큰 요청: 이 인증 코드를 바탕으로 requestAccessToken() 메서드를 통해 액세스 토큰을 요청합니다.
  4. 토큰 반환: 성공적으로 액세스 토큰을 받으면 이를 반환하거나, 실패 시 오류 메시지를 반환합니다.

이 코드는 네이버 OAuth 인증 절차에 맞춰 액세스 토큰을 요청하고, 이를 바탕으로 소셜 로그인 기능을 제공하기 위한 구조입니다.

⭐ 테스트

위 사진과 같이 네이버 로그인이 제대로 실행되는 것을 확인할 수 있습니다!

 


📌 참고

 

네이버 로그인 개발가이드 - LOGIN

네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디

developers.naver.com