0. 프로젝트 소개(Spring Security) 및 Security에 대하여
1. User Entity 생성(Spring Security)
2. User 회원가입 (Spring Secureity)
3.Jwt의 사용 이유 (Spring Security)
4. Authorization(인증)
- 4-0 Authorization(인증) - 프로세스 설명
- 4-1 Authentication(인증) - UserDetails, UserDetailsService 및 JwtService 생성
- 4-2 Authentication(인증) - UsernamePasswordAuthenticationfilter 생성
- 4-3 Authentication(인증) - CorsFilter(선택사항)
- 4-4 Authentication(인증) - SecurityConfig
5. Authorization(인가)
- 5-1 Authorization(인가) - Jwt 인가 관련 에러 처리
- 5-2 Authorization(인가) - Jwt 인가 서비스 로직 추가
- 5-3 Authorization(인가) - AuthorizationFilter 생성
- 5-4 Authorization(인가) - SecurityConfig에 인가 관련 method 추가
6. OAuth
DefaultOAuth2User을 상속받는 CustomOAuth2User 생성
@Getter
public class CustomOAuth2User extends DefaultOAuth2User {
private String email;
private String userRole;
public CustomOAuth2User(Collection<? extends GrantedAuthority> authorities, Map<String, Object> attributes, String nameAttributeKey, String email, String userRole) {
super(authorities, attributes, nameAttributeKey);
this.email = email;
this.userRole = userRole;
}
}
※CustomOAuth2User 생성 이유
OAuth 로그인 시 OAuth2UserService의 loadUser(뒤에 나올 예정) method가 실행되는데 리턴 타입이 OAuth2User이며
DefaultOAuth2User를 구현한 클래스이다(OAuth2User > DefaultOAuth2Usder > CustomOAuth2User).
따라서 DefaultOAuthUser 타입의 변수를 return해줘야 한다.
Refresh Token을 갖기 위해서는 ID와 권한을 가지고 있어야하느데 DefaultOAuth2User에는 ID와 권한 필드를 가지고 있지 않기 때문에 CustomOAuth2User를 구현한 것이다.
OAuth2UserDto 생성
@Getter
@AllArgsConstructor
public abstract class OAuth2UserDto {
protected Map<String, Object> attributes;
public abstract String getId();
public abstract String getNickname();
public abstract String getProfileUrl();
}
KAKAO와 GOOGLE에 대한 DTO를 생성할 예정이기 때문에 공통으로 사용될 method를 추상 method로 만든다.
KakaoOAuth2UserDto
public class KakaoOAuth2UserDto extends OAuth2UserInfo {
public KakaoOAuth2UserDto(Map<String, Object> attributes) {
super(attributes);
}
@Override
public String getId() {
return String.valueOf(attributes.get("id"));
}
@Override
public String getNickname() {
Map<String, Object> account = (Map<String, Object>) attributes.get("kakao_account");
Map<String, Object> profile = (Map<String, Object>) account.get("profile");
return profile == null ? null : (String) profile.get("nickname");
}
@Override
public String getProfileUrl() {
Map<String, Object> account = (Map<String, Object>) attributes.get("kakao_account");
Map<String, Object> profile = (Map<String, Object>) account.get("profile");
return profile == null ? null : String.valueOf(profile.get("thumbnail_image_url"));
}
}
카카오의 경우 User의 정보가 kakao_account에 한번 더 감싸있는 형태임으로 kakao_account를 한번 가져온 후 필요한 정보를 가져온다.
GoogleOAuth2UserDto
public class GoogleOAuth2UserDto extends OAuth2UserInfo{
public GoogleOAuth2UserDto(Map<String, Object> attributes) {
super(attributes);
}
@Override
public String getId() {
return String.valueOf(attributes.get("sub"));
}
@Override
public String getNickname() {
return (String) attributes.get("name");
}
@Override
public String getProfileUrl() {
return (String) attributes.get("picture");
}
}
getId()
- Kakao(Resource Server)에서 보내주는 식별 ID를 가져오는 method
getNickname()
- Kakao에서 제공하는 nickname을 가져오는 method
getProfileUrl()
- Kakao에서 제공하는 Profile사진을 가져오는 method
'SpringBoot Security' 카테고리의 다른 글
6-4 OAuth2.0 - OAuth2UserService (0) | 2023.08.27 |
---|---|
6-3 OAuth2.0 - OAuthAttribute (0) | 2023.08.27 |
6-1 OAuth 2.0 - 사전 설정 (0) | 2023.08.06 |
6-0 OAuth에 대해서 (0) | 2023.07.25 |
5-4 Authorization(인가) - SecurityConfig에 인가 관련 method 추가 (0) | 2023.07.11 |