티스토리 뷰
NaverLoginBO.java
NaverLoginBO는 네이버 로그인(OAuth2.0)을 구현하는 Spring 웹 애플리케이션에서 사용되는 NaverLoginBO클래스를 정의한것이다.
이 클래스는 네이버 로그인 API와 상호작용하며 사용자의 인증, 액세스 토큰 발급, 사용자 프로필 정보 가져오기 등의 작업을 수행한다.
네이버 로그인을 구현할 때 필요한 설정값
// 네이버 API를 사용하기 위한 클라이언트 시크릿(CLIENT_SECRET)을 저장하는 필드.
private String CLIENT_SECRET = "ㅁㅁㅁㅁㅁㅁㅁ";
// 네이버 API를 사용하기 위한 클라이언트 아이디(CLIENT_ID)를 저장하는 필드.
private String CLIENT_ID = "ㅁㅁㅁㅁㅁㅁㅁㅁㅁ";
/* 네이버 로그인 인증 후에 사용자를 리디렉션할 URL을 저장하는 필드 */
private final static String REDIRECT_URI = "http://localhost:8090/yegerina/member/userNaverLoginPro.do";
/* 세션에 저장할 때 사용할 세션 키(key)를 저장하는 필드, 세션 유효성 검사를 위한 난수값이 여기에 저장됨. */
private final static String SESSION_STATE = "oauth_state";
/* 프로필 조회 API URL */
private final static String PROFILE_API_URL = "https://openapi.naver.com/v1/nid/me";
⦁ CLIENT_SECRET
- 클라이언트 시크릿은 애플리케이션을 등록 할 때 네이버에서 발급한 비밀키이다.
- API 호출시 사용되며 애플리케이션의 보안을 위해 비밀로 유지해야한다.
⦁ CLIENT_ID
- 클라이언트 아이디는 애플리케이션을 등록 할 때 네이버에서 발급한 공개키이다.
- API 호출시 사용되며 공개적으로 알려져도 안정한 정보이다.
⦁ REDIRECT_URI
- 사용자가 로그인 및 권한 부여를 완료하면 네이버는 이 URL로 사용자를 리디렉션하여 애플리케이션으로 돌려보낸다.
- 애플리케이션에서 콜백을 처리하는 역할을 한다.
⦁ SESSION_STATE
- 네이버 로그인시, 사용자의 요청과 응답 간에 상태를 우지하기 위한 랜덤한 문자열이다.
- 이를 사용하여 요청과 응답의 일치성을 검증하고 보안을 강화한다.
⦁ PROFILE_API_URL
- 네이버 사용자 프로필 정보를 조회하기 위한 API엔드포인트(주소)를 저장하는 필드이다.
- 네이버에서 사용자 프로필 정보를 가져올 수 있다.
getAuthorizationUrl() 메서드
네이버 아이디로 인증하기 위한 URL을 생성하고 반환하는 메서드이다.
메서드 호출시 사용자가 네이버 로그인 페이지로 이동할 수 있는 URL이 생성되며, 사용자는 이 페이지에서 로그인 및 권한 부여를 수행한다.
로그인 및 권한 부여가 완료되면 네이버가 지정한 리디렉션 URL로 다시 돌아가며, 이후 애플리케이션에서 콜백 요청을 처리하여 사용자의 정보를 가져 올 수 있다.
/* 네이버 아이디로 인증 URL 생성 Method */
public String getAuthorizationUrl(HttpSession session) {
/* 세션 유효성 검증을 위하여 난수를 생성 */
String state = generateRandomString();
System.out.println("세션 유효성 검증을 위하여 난수를 생성@@" + state );
/* 생성한 난수 값을 session에 저장 */
setSession(session,state);
System.out.println("클라이언트아이디에 들어온 값"+CLIENT_ID);
System.out.println("클라이언트시크릿에 들어온 값"+CLIENT_SECRET);
/* Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성 */
OAuth20Service oauthService = new ServiceBuilder()
.apiKey(CLIENT_ID)
.apiSecret(CLIENT_SECRET)
.callback(REDIRECT_URI)
.state(state) //앞서 생성한 난수값을 인증 URL생성시 사용함
.build(NaverLoginApi.instance());
return oauthService.getAuthorizationUrl();
}
⦁ String state = generateRandomString();
세션 유효성 검증은 중요한 보안 기능중 하나이다.
사용자 요청과 응답 사이에 무결성을 보장하기 위해 랜덤한 토큰 또는 난수를 사용한다.
이를 통해서 중간자 공격과 같은 보안 위협을 방지하고 사용자의 신뢰성을 보호한다.
네이버 로그인 시 보안을 강화하는 중요한 단계 중 하나이다.
- generateRandomString()메서드를 호출하여 무작위로 생성된 문자열을 state변수에 저장한다.
- state변수의 값은 세션 유효성 검증을 위한 토큰 또는 난수로 사용된다.
즉, 사용자 요청과 응답 사이에 일치성을 검증하는 데 사용된다.
⦁ setSession(session, state);
- 앞서 생성한 state값을 세션에 저장한다.
- 세션은 사용자의 브라우저와 웹 애플리케이션 간에 정보를 유지하는 데 사용되며,
이 정보는 서버측에서 관리된다. session객체는 메서드의 파라미터로 전달된 HttpSession 객체를 가리킨다.
- 생성된 state값은 나중에 콜백 요청과 함께 수신되는데, 이를 사용하여 콜백 요청의 유효성을 검증한다.
콜백 요청에 포함된 state값과 세션에 저장된 state값이 일치 해야한다.
⦁ OAuth20Service oauthService = new ServiceBuilder()
Scribe라이브러리를 사용하여 OAuth2.0프로토콜을 사용하는 서비스를 설정하고 구성하는 부분이다.
OAuth2.0은 인증 및 권한 부여를 위한 프로토콜로, 이를 사용하여 다른서비스(네이버)에 대한 인증 및 권한을 관리할 수 있다.
이 코드는 Scribe라이브러리를 이용하여 OAuth2.0인증을 수행하기 위한 기본 서비스 객체를 생성하고 초기화 하는 역할을 한다.
OAuth20Service는 Scribe라이브러리에서 제공하는 클래스로, OAuth2.0프로토콜에 따라 인증및 권한 부여를 관리하는데 사용하며,
이 클래스의 인스턴스를 생성하기위해 ServiceBuilder클래스를 사용한다.
- ServiceBuilder클래스를 사용하여 OAuth2.0Service객체를 생성하고 초기화 한다.
- ServiceBuilder객체는 OAuth2.0인증 서비스를 구성하기위한 빌더 클래스로, 다양한 설정을 추가하고 구성할 수 있다.
.apiKey(CLIENT_ID)
- OAuth클라이언트의 식별자인 클라이언트 아이디를 설정한다.
- 네이버에 등록된 애플리케이션을 식별하는데 사용된다.
.apiSecret(CLIENT_SECRET)
- 클라이언트 시크릿(CLIENT_SECRET)을 설정한다.
- 클라이언트 아이디와 함께 사용되어 애플리케이션이 네이버 API와 통신할 때 보안을 제공한다.
.callback(REDIRECT_URI)
- 사용자가 인증을 환료한 후 리디렉션될 URL을 설정한다.
- 사용자가 네이버 로그인을 완료하면 네이버는 이 URL로 사용자를 리디렉션하여 애플리케이션으로 돌아가게 된다.
- REDIRECT_URI는 애플리케이션에서 미리 정의한 리디렉션 URL이다.
.state(state)
- 인증 URL생성 시에 사용되는 상태 정보(state)를 설정한다.
- 상태 정보는 보안목적으로 상요되며, 사용자의 요청과 응답 사이에 일치성을 검증하기 위한 용도로 사용된다.
- state값은 이전에 생성한 난수 값으로 설정된다.
.build(NaverLoginApi.instance())
- 앞서 설정한 정보를 바탕으로 OAuth20Service객체를 실제로 생성한다.
- NaverLoginApi.instance()는 네이버 로그인을 위한 API설정을 담고 있는 클래스(NaverLoginApi)의
인스턴스를 반환한다.
- 이 설정을 바탕으로 OAuth20Service객체가 네이버 인증을 처리할 준비를 마치게 된다.
⦁ return oauthService.getAuthorizationUrl();
OAuth20Service객체(oauthService)를 사용하여 네이버 아이디로 인증하기 위한 URL을 생성하고 반환하는 부분
- oauthService는 앞서 구성한 OAuth20Service객체 이다.
- OAuth2.0인증을 관리하고 네이버와의 통신을 담당하는 서비스 이다.
- getAuthorizationUrl()메서드는 OAuth20Service인터페이스의 메서드중 하나이며
OAuth20Service객체를 통해 OAuth2.0인증 URL을 생성하고 반환하는 역할을 한다.
※ 반환하는 getAuthorizationUrl()은 NaverLoginBO클래스의 getAuthorizationUrl메서드가 아니다.
메서드 체인(Method Chaining)
메서드 체인은 객체 지향 프로그래밍에서 사용되는 기법중 하나이다.
메서드 체인은 한 객체의 여러 메서드를 연달아 호출하여 코드를 간결하고 가독성 있게 만드는 방법이다.
Person person = new Person();
person.setName("StartCoriny");
person.setAge(26);
person.setAddress("123 Main St");
↓
Person person = new Person()
.setName("StartCoriny")
.setAge(26)
.setAddress("123 Main St");
특징
- 한 줄에 여러 메서드 호출 : 여러 메서드 호출을 한 줄에 연이어 작성할 수 있다.
- 동일한 객체 반환 : 각 메서드는 객체 자체를 반환하므로 다음 메서드를 연달아 호출할 수 있다.
- 가독성 향상 : 코드가 간결해지고 읽기 쉬워진다.
※ 메서드 체인을 사용하려면 해당 클래스 내에 각 메서드가 적절하게 정의 되어 있어야함.
getAccessToken()메서드
getAccessToken은 네이버 아이디로 로그인 후 콜백 처리를 수행하고 액세스 토큰을 획득하고 반환하는 역할을 한다.
이를 통해 사용자의 인증이 완료되고 인증된 사용자의 액세스 토큰을 얻을 수 있게 된다.
/* 네이버아이디로 Callback 처리 및 AccessToken 획득 Method */
public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException{
/* Callback으로 전달받은 세선검증용 난수값과 세션에 저장되어있는 값이 일치하는지 확인 */
String sessionState = getSession(session);
if(StringUtils.pathEquals(sessionState, state)){
OAuth20Service oauthService = new ServiceBuilder()
.apiKey(CLIENT_ID)
.apiSecret(CLIENT_SECRET)
.callback(REDIRECT_URI)
.state(state)
.build(NaverLoginApi.instance());
/* Scribe에서 제공하는 AccessToken 획득 기능으로 네아로 Access Token을 획득 */
OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
return accessToken;
}
return null;
}
⦁ public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state)
throws IOException
전달 받은 인증 코드와 세션 정보를 사용하여 액세스 토큰을 획득하고, 발생할 수 있는 입출력 예외를 처리하기 위해 IOException을 선언하는 메서드이다.
HttpSession session
- HttpSession은 웹 애플리케이션에서 클라이언트와 서버 간의 상태 정보를 유지하고 공유하기 위한 객체이다.
- 웹 세션을 나타내는 객체로, 세션을 통해 상태 정보를 저장하고 검증하는 데 사용된다.
String code
- 네이버로 부터 받은 인증코드(Authorization Code)이다.
- 사용자가 네이버로그인을 성공적으로 완료한 후에 생성되며 애플리케이션에게 전달되는 값이다.
후속 단계에서 액세스 토큰을 받기위한 필수 요소이다.
String state
- 세션에서 가져온 상태 값(State Value)을 나타낸다.
- 이 값은 네이버 로그인 요청 시 생성된 상태 값을 나타내며, 콜백 시에 이 값을 사용하여
요청의 유효성(세션상태)을 검증하기 위해 사용한다.
⦁ if(StringUtils.pathEquals(sessionState, state))
StringUtils는 스프링 프레임워크의 유틸리티 클래스로서 문자열 관련 작업을 쉽게 수행하기 위해 사용된다.
sessionState와 state라는 두 문자열을 비교하여 두문자열이 동일하면 true, 아니면 false를 반환한다.
콜백 요청이 이전에 생성한 로그인 요청과 일치하는지를 확인하는 중요한 부분으로, 이 일치 여부에 따라 로그인 요청의 유효성을 검증한다.
sessionState
- 이 변수는 세션에서 가져온 상태 값(State Value)을 나타낸다.
- 세션은 클라이언트와 서버 간의 상태를 유지하고 공유하는데 사용되며 이 변수에는 이전에 생성한 상태값이 저장되어
있어야 한다.
state
- 이 변수는 현재요청에서 전달받은 상태 값(State Value)을 나타낸다.
- 사용자가 로그인 요청을 보낼 때 생성된 상태 값을 나타내며, 로그인 요청과 콜백 요청 간에 이 값이 일치하는지
확인하여 요청의 유효성을 검증한다.
⦁ OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
OAuth2.0인증 코드 그랜트 타입(Authorization Code Grant Type)을 사용하여 액세스 토큰을 얻는 방식중에 하나이다.
이 방식은 보안을 강화하기 위해 사용자 인증 과정과 액세스 토큰 발급 과정을 분리하는데 사용된다.
이 후에 이 액세스 토큰을 사용하여 보호된 리소스에 접근할 수 있다.
oauthService.getAccessToken(code)
- oauthService 객체를 사용하여 네이버로부터 액세스 토큰을 요청하는 부분이다.
- 코드(code)는 사용자 인증후에 얻은 인증 코드(Authorization Code)를 의미하며, 이를 통해 액세스 토큰을 요청한다.
- 인증코드는 사용자가 로그인 요청을 승인한 후에 얻을 수 있다.
- 위 코드를 호출 하면 OAuth2.0서비스가 네이버로 액세스 토큰 요청을 보내고,
네이버 서버에서는 해당 요청을 검증하고 유효한 경우 액세스 토큰을 발급 한다.
- 발급된 액세스 토큰을 OAuth2AccessToken객체에 저장되고,
이 객체를 통해 애플리 케이션에서 API호출 등의 보호된 리소스에 접근 할 수 있게 된다.
메서드 안에서 사용하기 위해 미리 정의해둔 메서드
코드를 재사용 하거나 더 가독성 있고 모듈화된 코드를 작성하기위해 사용된다.
아래와 같은 메서드 추상화와 모듈화는 코드를 보다 이해하기 쉽고 유지 보수하기 용이하게 만든다.
/* 세션 유효성 검증을 위한 난수 생성기 */
private String generateRandomString() {
return UUID.randomUUID().toString();
}
/* http session에 데이터 저장 */
private void setSession(HttpSession session,String state){
session.setAttribute(SESSION_STATE, state);
}
/* http session에서 데이터 가져오기 */
private String getSession(HttpSession session){
return (String) session.getAttribute(SESSION_STATE);
}
⦁ generateRandomString()
UUID.randomUUID().toString();
- Java에서 UUID(Universally Unique Identifier)를 생성하고 이를 문자열로 변환하는 과정을 수행하는 코드이다.
- UUID는 128비트(16바이트)의 값으로 구성되며, 시간, 노드 클락등 다양한 요소를 기반으로 고유성을 보장한다.
- randomUUID()메서드를 호출하여 무작위로 생성된 UUID를 반환한뒤 toString()메서드로 하이픈을 포함한 문자열로 변환한다.
- UUID는 다양한 분야에서 고유한 식별자를 생성하는 데 사용한다.
getUserProfile()메서드
액세스 토큰을 사용하여 네이버 사용자 프로필 정보를 가져오는 작업을 수행하는 메서드이다.
요청하고 반환된 문자열로 사용자 프로필 정보를 애플리케이션에서 활용 할 수 있다.
/* Access Token을 이용하여 네이버 사용자 프로필 API를 호출 */
public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException{
OAuth20Service oauthService =new ServiceBuilder()
.apiKey(CLIENT_ID)
.apiSecret(CLIENT_SECRET)
.callback(REDIRECT_URI).build(NaverLoginApi.instance());
OAuthRequest request = new OAuthRequest(Verb.GET, PROFILE_API_URL, oauthService);
oauthService.signRequest(oauthToken, request);
Response response = request.send();
return response.getBody();
}
⦁ getUserProfile(OAuth2AccessToken oauthToken)
- 액세스 토큰은 네이버 API를 사용하기 위한 권한을 나타내며, 이를 통해 사용자 프로필 정보를 가져올 수 있다.
⦁ OAuthRequest request = new OAuthRequest(Verb.GET, PROFILE_API_URL, oauthService);
GET메서드를 사용하여 네이버 프로필 정보를 요청할 준비가 된 OAuthRequest객체를 생성하고 초기화 하는 단계이다.
이 객체는 액세스 토큰을 사용하여 네이버 서버로 보내져 프로필 정보를 요청하게 된다.
- 네이버 프로필 정보 API에 대한 요청을 나타낸다.
OAuthRequest
- ScribeJava 라이브러리에서 제공하는 클래스로,
OAuth 인증 프로토콜을 사용하여 API에 요청을 보내는데 사용된다.
Verb.GET
- HTTP요청 메서드 중 GET메서드를 나타낸다.
- GET요청은 서버로부터 데이터를 요청하는데 사용되며,
이 경우 네이버 프로필 정보를 가져오는것이므로 GET메서드를 사용한다.
PROFILE_API_URL
- 네이버 사용자 프로필 정보를 가져올 API 엔드포인트의 URL이다.
- 네이버 API 서버의 프로필 정보를 반환하는 엔드포인트를 나타낸다.
oauthService
- OAuth20Service객체이며 OAuth2.0프로토콜을 사용하여 인증 및 권한 부여를 처리하고,
API요청을 서명하는데 사용된다.
⦁ oauthService.signRequest(oauthToken, request);
OAuth2.0 인증을 사용하여 생성한 OAuthRequest객체를 서명하는 부분이다.
서명은 요청에 액세스 토큰을 추가하고 해당 요청을 유효한 OAuth 요청으로 만든다.
서명된 요청은 서버에 보내져 인증 및 권한 부여를 수행하며, 요청이 유효하면 서버는 요청에 응답한다.
∴ 위 코드는 OAuth2.0인증을 사용하여 request를 서명하여 네이버 API 서버로 안전하게 보낼 수 있도록 하는 작업을 수행한다.
oauthService
- 이전에 생성한 OAuth20Service객체이다.
- OAuth2.0프로토콜을 관리하며, 애플리케이션에서 네이버 API와 통신할 때 필요한 정보를 가지고 있다.
oauthToken
- 액세스 토큰(OAuth20Service)을 나타낸다.
- 사용자가 로그인 한 후 권한을 부여한 결과로 받게 되며, API요청을 보낼 때 사용된다.
- 서버에서는 이 토큰을 통해 사용자를 인증하고 권한을 확인한다.
request
- OAuth인증을 사용하여 네이버 API에 보낼 HTTP요청을 나타내는 OAuthRequest객체이다.
- API엔드포인트와 요청 메서드(GET, POST 등)를 설정한 상태이다.
⦁ Response response = request.send();
OAuthRequest객체를 사용하여 네이버 API서버로 HTTP요청을 보내고, 서버로부터의 응답을 response 객체로 받아오는 과정을 나타낸다.
이 후 response객체를 통해 서버 응답을 처리하고, 사용자 프로필 정보 또는 기타 데이터를 추출 할 수 있게 된다.
- request객체를 사용하여 HTTP 요청을 실제로 서버로 보낸다. 네트워크 통신을 시작하는 단계이다.
- request객체는 앞에서 생성한 OAuthRequest객체이며 네이버 API엔드포인트와 요청 메서드등이 성정되어 있다.
- request에 설정된 내용을 기반으로 서버로 HTTP요청을 보내고, 서버로부터의 응답을 response객체에 저장한다.
이 시점에서 네이버 서버는 요청을 처리하고, 사용자 프로필 정보나 기타 데이터를 응답으로 반환한다.
Response
- Response클래스는 HTTP요청에 대한 서버 응답을 나타내는 클래스이다. 응답코드, 응답 본문 등을 포함한다.
⦁ return response.getBody();
네이버 API서버로부터 받은 HTTP응답에서 본문을 추출하고, 이를 getUserProfile메서드의 반환값으로 반환하는 역할을 한다.
추출된 본문은 이후에 필요한 데이터를 분석하고 사용할 수 있게 된다.
- getBody()메서드로 추출한 응답 본문을 메서드의 반환 값으로 사용하며
getUserProfile메서드의 반환값으로 사용되므로, 최종적으로는 사용자의 프로필 정보 또는 기타 데이터가 반환된다.
.getBody()
- response객체의 getBody()메서드는 HTTP응답의 본문을 추출하는 메서드이다.
- 본문은 주로 JSON 또는 XML형식으로 반환되며, 이는 서버로부터 받은 데이터의 실제 내용을 담고 있다.
'project > yegerina(개인 프로젝트)' 카테고리의 다른 글
NaverLoginApi (0) | 2023.10.10 |
---|