Spring Boot + Social Login(Kakao)
Spring Boot & Kakao Social Login 연동
Published in
6 min readOct 7, 2020
OAuth 2.0
타사의 API 사용하고 싶을 때 권한 획득 및 인증을 위한 Open Standard Protocol
OAuth 구조
OAuth 구성
- Client : 사용자
- Resource Owner : API DB 사용자
- Resource Server : API 서버
- AUthorization Server : OAuth 인증 서버
OAuth Flow
(A) Client 가 Social Login 요청
(B) Resource Owner 는 Social Login 할 수 있게 화면 이동
© Client 는 Social Login 완료
(D) 로그인이 성공하면 AUthorization Server 는 Client 에게 Access Token 발급
(E) Client 는 발급받은 Token 으로 Resource Server 에게 Resource 를 요청
(D) Resource Server 는 Token 유효한지 검증하고 응답 처리
Kakao Soical Login
Token 종류
- Access Token : API 호출 권한 인증용 Token
- Refresh Token : Access Token 갱신용 Token
Kakao Developer 관리
구현 순서
RestTemplate Bean 등록
- Main Application Class 에 RestTemplate Class Bean 등록
@Bean
public RestTemplate getRestTemplate() { return new RestTemplate(); }
GSON dependency 추가
implementation 'com.google.code.gson:gson'
Social Login 관련 설정 추가
spring.social.kakao.client_id=[앱생성시 받은 REST API Key]
spring.social.kakao.redirect=/social/login/kakao
spring.social.kakao.url.login=https://kauth.kakao.com/oauth/authorize
spring.social.kakao.url.token=https://kauth.kakao.com/oauth/token
spring.social.kakao.url.profile=https://kapi.kakao.com/v2/user/me
Social Login 처리 Controller 추가
- Kakao Login 화면으로 Fowording 할 수 있는 Demo 페이지 연동 처리
- Kakao 연동 후 redirect 처리
로그인 화면
- /resource/templates/social/login.ftl
<button onclick="popupKakaoLogin()">KakaoLogin</button>
<script>
function popupKakaoLogin() {
window.open('${loginUrl}', 'popupKakaoLogin', 'width=700,height=500,scrollbars=0,toolbar=0,menubar=no');
}
</script>
(만약 View Mapping 안된다면, Freemarker Bean 등록!)
User Entity 수정
- provoider 필드 추가
- Social Login 은 비밀번호가 필요없으므로 password 필드는 Null 허용으로 변경
User JPA Repository 수정
- Uid 와 Provider 로 회원 정보 조회하는 Method 추가
Optional<User> findByUidAndProvider(String uid, String provider);
Social Login 에 필요한 Model 객체 생성
- RetKakaoAuth.java
@Getter
@Setter
public class RetKakaoAuth {
private String access_token;
private String token_type;
private String refresh_token;
private long expires_in;
private String scope;
}
- KakaoProfile.java
@Getter
@Setter
@ToString
public class KakaoProfile {
private Long id;
private Properties properties;
@Getter
@Setter
@ToString
private static class Properties {
private String nickname;
private String thumbnail_image;
private String profile_image;
}
}
Kakao 연동 Service 생성
- Kakao Token 조회 method 구현
- Kakao profile 조회 method 구현
Social Login 연동할 REST API 추가
- Kakao 와 연동 여부 확인한 후 JWT Token 발급 처리
Security Config 관련 설정 수정
- “/social/**” API 권한 승인 처리
추가
Social Login TEST Flow
- /social/login 접속
- 소셜 로그인 요청
- 소셜 로그인 완료 후 access_token 발급
- /swagger-ui.html 접속
- /api/sign/signup/{provider} 사용자 가입
- 발급받은 Social Login access_token 필요
- /api/sign/singin 사용자 로그인하여 JWT Token 발급
- 발급받은 JWT Token 으로 API 테스트
Social Login 관련 기타 Class 및 Interface2
RestTemplate Class
- Spring 에서 지원하는 REST API 를 호출하고 응답 받을 때까지 기다리는 동기 방식의 내장 Class (비동기식은 AsyncRestTemplate.class)
- HTTP 프로토콜의 메서드들 제공