1. OAuth2 인증 흐름
OAuth2는 사용자 인증 및 권한 부여를 관리하기 위한 표준 프로토콜입니다. Google 인증을 통해 사용자 정보를 처리하기 위해 아래와 같은 과정을 거쳤습니다:
- 사용자 인증 요청
사용자가 프론트엔드에서 Google 로그인 버튼을 클릭하면 Google OAuth 서버로 리디렉션됩니다.
redirect_uri에 설정된 주소로 인증 코드(Authorization Code)가 반환됩니다. - Authorization Code 처리
프론트엔드에서 받은 Authorization Code를 백엔드로 전달합니다.
백엔드에서는 이 코드를 Google 서버에 전달하여 Access Token과 사용자 정보를 받습니다. - Access Token 교환 및 사용자 정보 저장
Access Token을 통해 Google의 사용자 정보 API를 호출하여 이메일, 이름 등의 정보를 가져옵니다.
이를 기반으로 DB에 사용자를 저장하거나 기존 사용자 정보를 조회합니다.
2. 구현된 주요 기능
(1) AuthController
- /oauth2/token
프론트엔드에서 Authorization Code를 받아 Google 서버와 통신하여 Access Token과 사용자 정보를 처리합니다.
@PostMapping("/oauth2/token")
public ResponseEntity<LoginResponseDTO> handleAuthorizationCode(
@RequestBody OAuth2TokenRequestDTO request) {
LoginResponseDTO response = oAuth2Service.processAuthorizationCode(request.getCode());
return ResponseEntity.ok(response); }
(2) OAuth2Service
- Authorization Code를 Google 서버에 보내고 Access Token을 받아옵니다.
- Access Token을 사용하여 사용자 정보를 가져옵니다.
public LoginResponseDTO processAuthorizationCode(String authorizationCode){
Map<String, String> tokenResponse = exchangeAuthorizationCodeForToken(authorizationCode);
String accessToken = tokenResponse.get("access_token");
Map<String, Object> userInfo = getUserInfoFromGoogle(accessToken);
User user = findOrCreateUser(userInfo);
return new LoginResponseDTO("Login successful", user, accessToken);
}
(3) SecurityConfig
- Google OAuth2 인증 성공 후 리디렉션 URL 설정.
- /oauth2/**와 /api/auth/** 경로 허용.
3. 주요 이슈 및 해결
- Redirect URI 오류
- 문제: Google Cloud Console의 redirect_uri와 애플리케이션의 URI가 일치하지 않음.
- 해결: http://localhost:9090/login/oauth2/code/google로 정확히 설정.
- Authorization Code 값 확인
- 문제: 브라우저 리디렉션으로 인해 코드 확인이 어려움.
- 해결: 프론트엔드에서 코드를 백엔드로 전달하도록 로직 구현.
- Access Token 관리
- 문제: Access Token 생성 방식이 Google 서버의 응답과 일치하지 않음.
- 해결: Google의 Access Token을 그대로 사용하도록 수정.
4. 테스트
Swagger 및 Postman 테스트
- /oauth2/token API 호출 시:
Request: Authorization Code 포함.
{ "code": "4/0AY0e-g7RyjEXAMPLE" }
Response: 사용자 정보와 Access Token 반환.
{ "message": "Login successful", "user":
{ "email": "test@gmail.com", "userName": "Test User" },
"accessToken": "ya29.a0Ae_example_token" }
5. 주요 학습 내용
- OAuth2 인증 구조 이해
- Authorization Code → Access Token → UserInfo 흐름.
- RestTemplate을 사용한 Google 서버와의 통신.
- Spring Security와 OAuth2 연동
- SecurityConfig를 통해 OAuth2 로그인 성공 후 처리.
- Error Handling
- Redirect URI, Missing Parameters 등 발생 가능한 오류에 대한 해결법.
6. 추가 고려 사항
- 토큰 만료 처리
Access Token의 유효기간 만료 시 새로운 토큰을 요청하는 로직 추가 필요. - 환경 변수 관리
Google OAuth 설정값(client_id, client_secret)은 환경 변수로 관리하여 보안 강화. - 사용자 경험 개선
- 로그인 실패 시 사용자 친화적인 에러 메시지 제공.
- 프론트엔드와의 통합 테스트 진행.
'프로그래밍 > 토이프로젝트' 카테고리의 다른 글
와탭에 lightsail 인스턴스 서버 연결하기(WHATAP - AWS LightSail) (0) | 2024.12.31 |
---|---|
서버 모니터링 툴을 활용한 프로젝트 성능 관리 (2) | 2024.12.31 |
JpaRepository란 무엇인가? Spring Data JPA의 CRUD 연동을 쉽게 만드는 방법! (0) | 2024.11.10 |
[2차 개발] 주제 변경, 기획 그리고 고민 (1) | 2024.10.31 |
배포 후 이미지 업로드 시 500 에러 발생 (0) | 2024.10.31 |