전자정부프레임워크와 Spring Security를 이용해 OAuth 2.0에서 제공받은 Access Token을 활용하여 API 요청을 수행하고, 해당 토큰의 유효성을 검증하는 방법을 학습합니다.
1. OAuth 2.0 Access Token이란?
Access Token은 사용자가 권한 서버에서 인증받은 후, 클라이언트가 리소스 서버에 데이터 요청을 할 때 사용하는 짧은 수명의 인증 키입니다.
- Access Token의 특징:
- Bearer Token 방식으로 헤더에 포함하여 사용.
- 권한 서버에서 발급하며 제한된 시간 동안만 유효.
- 기밀 정보 대신 사용하여 보안을 강화.
2. Access Token 기반 API 요청 흐름
- 사용자가 클라이언트를 통해 인증 및 권한 부여를 완료.
- 권한 서버에서 Access Token을 발급.
- 클라이언트는 Access Token을 사용해 리소스 서버로 API 요청.
- 리소스 서버는 Access Token의 유효성을 검증한 후 데이터를 반환.
3. API 요청 구현
3-1. RestTemplate을 활용한 API 호출
Spring의 RestTemplate을 사용하여 Access Token을 포함한 API 요청을 구현합니다.
API 요청 코드 (Google 사용자 정보 요청):
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
public class ApiService {
private static final String USER_INFO_API_URL = "https://www.googleapis.com/oauth2/v3/userinfo";
public String getUserInfo(String accessToken) {
RestTemplate restTemplate = new RestTemplate();
// Access Token을 Authorization 헤더에 추가
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + accessToken);
HttpEntity entity = new HttpEntity<>(headers);
// API 호출
ResponseEntity response = restTemplate.getForEntity(USER_INFO_API_URL, String.class, entity);
return response.getBody();
}
}
4. Access Token 검증
Access Token은 유효한 시간 범위 내에서만 작동하며, 리소스 서버에서 검증이 필요합니다.
4-1. Access Token 만료 처리
Access Token이 만료되면, 클라이언트는 Refresh Token을 사용해 새로운 Access Token을 요청해야 합니다.
Access Token 갱신 요청 (예시):
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
public class TokenService {
private static final String TOKEN_REFRESH_URL = "https://oauth2.googleapis.com/token";
public String refreshAccessToken(String clientId, String clientSecret, String refreshToken) {
RestTemplate restTemplate = new RestTemplate();
// HTTP 요청 본문 구성
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/x-www-form-urlencoded");
String body = String.format(
"client_id=%s&client_secret=%s&refresh_token=%s&grant_type=refresh_token",
clientId, clientSecret, refreshToken
);
HttpEntity entity = new HttpEntity<>(body, headers);
// Access Token 갱신 요청
ResponseEntity response = restTemplate.postForEntity(TOKEN_REFRESH_URL, entity, Map.class);
// 갱신된 Access Token 반환
return (String) response.getBody().get("access_token");
}
}
4-2. Access Token 검증 요청
Google API에서는 Access Token의 유효성을 확인하는 전용 API를 제공합니다.
Access Token 검증 API 호출:
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
public class TokenValidationService {
private static final String TOKEN_VALIDATION_URL = "https://oauth2.googleapis.com/tokeninfo";
public boolean validateAccessToken(String accessToken) {
RestTemplate restTemplate = new RestTemplate();
// 토큰 검증 API 호출
String url = TOKEN_VALIDATION_URL + "?access_token=" + accessToken;
ResponseEntity response = restTemplate.getForEntity(url, String.class);
// 유효성 확인
return response.getStatusCode().is2xxSuccessful();
}
}
5. 사용자 정보 활용하기
Access Token을 이용해 얻은 사용자 정보를 활용하여 애플리케이션에서 맞춤형 서비스를 제공합니다.
5-1. 사용자 정보 저장
사용자 정보는 DB에 저장하여 세션 또는 인증 토큰과 연계합니다.
사용자 테이블 예:
CREATE TABLE user_info (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
picture VARCHAR(500),
access_token TEXT,
refresh_token TEXT
);
5-2. 사용자 데이터 처리 (예시):
public void saveUserInfo(String name, String email, String picture, String accessToken, String refreshToken) {
// 사용자 정보 DB 저장 로직
}
6. 테스트
- 사용자 정보 API 요청:
- ApiService를 호출하여 사용자 정보를 가져옵니다.
- Access Token 검증:
- TokenValidationService를 호출하여 토큰의 유효성을 확인합니다.
- 토큰 갱신:
- Access Token이 만료된 경우, TokenService를 이용해 토큰을 갱신합니다.
7. 마무리
이번 학습에서는 OAuth 2.0의 Access Token을 사용하여 리소스 서버에 API 요청을 수행하고, 토큰의 유효성을 검증하는 방법을 다뤘습니다. 이를 통해 사용자 데이터와 API 요청을 안전하게 처리할 수 있습니다.
다음에서는 Refresh Token 전략과 로그아웃 구현에 대해 학습합니다.
'개발 > 전자정부프레임워크' 카테고리의 다른 글
OAuth 2.0 커스텀 인증 필터 구현 (0) | 2024.12.26 |
---|---|
Refresh Token 전략과 로그아웃 구현 (1) | 2024.12.26 |
OAuth 2.0을 이용한 소셜 로그인 구현 (0) | 2024.12.26 |
API 서버와 클라이언트 간의 데이터 암호화 및 보안 (0) | 2024.12.26 |
JWT(JSON Web Token)를 활용한 토큰 기반 인증 (0) | 2024.12.26 |