구글 소셜 로그인과 카카오 소셜 로그인을 구현했던 이전글에 이어서 네이버 소셜 로그인을 구현해보도록 하겠습니다!
구글 소셜 로그인 구현 방법과 카카오 소셜 로그인 구현 방법은 아래 글에서 확인할 수 있습니다!
특히, 전체적인 코드 구조와 설명은 구글 소셜 로그인 글에서 확인하실 수 있으니 이 글을 위주로 이해하시면 될 거 같습니다!
⭐ 코드 설명
✅ 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 생성과 액세스 토큰을 요청하는 기능을 제공합니다. 스프링의 여러 어노테이션과 라이브러리를 사용하여 구성되었습니다. 주요 기능과 흐름을 설명하겠습니다.
주요 역할 및 구성 요소
- 클래스 어노테이션
- @Component: 이 클래스는 스프링의 빈(Bean)으로 등록됩니다. 즉, 스프링 컨텍스트에서 이 클래스의 객체를 관리하게 됩니다.
- @RequiredArgsConstructor: 이 어노테이션은 클래스 필드에 선언된 final 또는 @NonNull 필드를 위한 생성자를 자동으로 생성해줍니다. 하지만 이 코드에서는 생성자 주입을 사용하지 않고, @Value를 통해 설정값을 주입받고 있습니다.
- @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.
- 네이버 소셜 로그인에 필요한 URL, 클라이언트 ID, 시크릿 키 등을 application.properties 또는 application.yml 파일에서 주입받습니다.
메서드 설명
- getOauthRedirectURL()
- 이 메서드는 네이버 로그인 인증 페이지로 리다이렉트하기 위한 URL을 생성합니다.
- 파라미터 구성:
- response_type: 네이버 로그인 서버가 반환할 응답 타입으로, "code"는 인증 코드를 요청한다는 의미입니다.
- client_id: 네이버 개발자 콘솔에서 발급받은 클라이언트 ID.
- redirect_uri: 인증 후 리다이렉트할 콜백 URL.
- state: CSRF(사이트 간 요청 위조) 방지를 위한 임의의 문자열. 매 요청마다 다르게 설정하는 것이 보안에 좋습니다.
- URL 생성: 파라미터들을 key=value 형식으로 변환한 후, &로 이어붙여 네이버 로그인 인증 요청 URL을 완성하여 반환합니다.
- 반환값: 네이버 소셜 로그인 페이지로 리다이렉트할 URL.
- 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
⭐ 전체적인 흐름
- 리다이렉트 URL 생성: 사용자가 네이버 로그인을 요청하면 getOauthRedirectURL() 메서드가 호출되어 네이버 로그인 페이지로 리다이렉트할 URL을 생성합니다.
- 인증 코드 수신: 사용자가 네이버 로그인 페이지에서 로그인하면, 네이버는 해당 콜백 URL로 인증 코드를 전달합니다.
- 액세스 토큰 요청: 이 인증 코드를 바탕으로 requestAccessToken() 메서드를 통해 액세스 토큰을 요청합니다.
- 토큰 반환: 성공적으로 액세스 토큰을 받으면 이를 반환하거나, 실패 시 오류 메시지를 반환합니다.
이 코드는 네이버 OAuth 인증 절차에 맞춰 액세스 토큰을 요청하고, 이를 바탕으로 소셜 로그인 기능을 제공하기 위한 구조입니다.
⭐ 테스트
위 사진과 같이 네이버 로그인이 제대로 실행되는 것을 확인할 수 있습니다!
📌 참고