1. 소개
OAuth2 인증이란?
OAuth(”Open Authorization”)는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로 사용되는, 접근 위임을 위한 개방형 표준이다.
Spring Boot에서 OAuth2를 사용하면 소셜 로그인(카카오, 구글, 네이버 등) 또는 OAuth2 인증 서버와의 연동을 쉽게 구현할 수 있다.
Spring Security의 OAuth2 Client 기능을 활용하면, 인증 및 액세스 토큰 관리까지 자동으로 처리할 수 있다.
기본 개념
OAuth2는 사용자의 로그인 정보를 직접 다루지 않고, 외부 서비스(카카오, 구글 등)을 통해 인증을 수행하는 프로토콜
이를 통해 보안성을 높이고, 사용자 인증을 쉽게 구현할 수 있음
OAuth2의 주요 개념
- Resource Owner (사용자): 로그인하는 사람
- Client (서버): 인증을 요청하는 애플리케이션
- Authorization Server (카카오, 구글 등): 인증을 제공하는 서버
- Resource Server: 사용자 정보(API 등)를 제공하는 서버
- Access Token: 인증이 완료된 후, 보호된 리소스(API)를 요청할 때 사용하는 토큰
- Refresh Token: Access Token이 만료되었을 때, 새로운 Access Token을 발급받을 때 사용하는 토큰
2. 적용 방법
1. 의존성 추가
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
}
2. OAuth2 설정
application.yml - kakao
spring:
security:
oauth2:
client:
registration:
kakao:
client-id: your-client-id # 카카오에서 발급받은 Client ID
client-secret: your-client-secret
redirect-uri: http://localhost:8080/login/oauth2/code/kakao
authorization-grant-type: authorization_code
scope:
- profile_nickname
- account_email
provider:
kakao:
authorization-uri: https://kauth.kakao.com/oauth/authorize
token-uri: https://kauth.kakao.com/oauth/token
user-info-uri: https://kapi.kakao.com/v2/user/me
user-name-attribute: id
application.yml - Google
spring:
security:
oauth2:
client:
registration:
google:
client-id: your-google-client-id
client-secret: your-google-client-secret
scope:
- profile
- email
3. OAuth2 로그인 컨트롤러 만들기
OAuth2 로그인이 완료되면, Spring Security가 자동으로 사용자 정보를 가져오고, 이를 컨트롤러에서 확인할 수 있다.
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@GetMapping("/user")
public ResponseEntity<Map<String, Object>> getUser(@AuthenticationPrincipal OAuth2User oauth2User) {
return ResponseEntity.ok(oauth2User.getAttributes());
}
}
@AuthenticationPrincipal OAuth2User oauth2User -> 현재 로그인한 사용자 정보
사용자의 카카오 프로필 정보, 이메일 등을 확인 가능
4. OAuth2 로그인 후 JWT 발급 (프론트엔드 연동)
OAuth2 로그인이 완료된 후, 우리 서버에서 JWT(JSON Web Token) 을 발급해서 프론트엔드와 연동할 수 있다.
@RestController
@RequestMapping("/api/auth")
public class AuthController {
private final JwtUtil jwtUtil;
public AuthController(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
@GetMapping("/kakao/callback")
public ResponseEntity<?> kakaoCallback(@AuthenticationPrincipal OAuth2User oauth2User) {
String email = oauth2User.getAttribute("kakao_account").get("email").toString();
// JWT 발급
String jwtToken = jwtUtil.generateToken(email);
return ResponseEntity.ok(new AuthResponse(jwtToken));
}
static class AuthResponse {
private String token;
public AuthResponse(String token) { this.token = token; }
public String getToken() { return token; }
}
}
3. OAuth2 인증 흐름 정리
1. 사용자가 로그인 버튼 클릭 → 카카오/구글 로그인 페이지 이동
2. 사용자가 인증 완료 → 리디렉트 URI로 인증 코드 전달
3. Spring Boot가 인증 코드를 받아서 Access Token 요청
4. Access Token을 사용해 사용자 정보 요청 (/user)
5. 사용자 정보를 바탕으로 JWT를 발급하고 프론트엔드에 전달
6. 프론트엔드는 JWT를 저장하고 API 요청 시 사용
참고
[OAuth] OAuth 2.0의 개념과 과정
안녕! 우아한테크코스 5기 [스탬프크러쉬]팀 깃짱이라고 합니다. 스탬프크러쉬 서비스의 소스 코드 바로가기 💋 인트로 우테코 프로젝트를 진행하면서 회원가입 및 로그인 기능을 구현해야 했
engineerinsight.tistory.com
'Spring' 카테고리의 다른 글
Spring Boot에서 웹소켓(WebSocket) 사용하기 (0) | 2025.02.17 |
---|---|
Spring Boot에서 Presigned URL을 사용한 S3 업로드 (0) | 2025.02.14 |
[Spring] Swagger (0) | 2025.02.10 |
[Spring] Spring Boot에서 DB Replication (0) | 2025.02.10 |
[Spring] Redis를 이용한 캐싱 기법 (0) | 2025.02.08 |