소셜 로그인 성공하면 헤더 값에 토큰을 세팅을 해놓았는데 로그인 과정 중 리다이렉션 쪽에서 헤더값에 토큰들이 설정되있더라구요.
그래서 해당 헤더 값을 어떻게 가져올지 생각했는데 쿼리 파라미터는 보안 상 안좋을것같습니다.
그래서 일단 spring 코드 내에서 로그인 성공하면 request.getSession().setAttribute로 토큰 값을 저장 후 추가정보 기입 페이지 리다이렉션을 @GetMapping으로 받아서 (String) request.getSession().getAttribute 로 토큰 값을 꺼낸 후 헤더 값에 세팅하는 형식으로 했습니다. 이렇게 하는지 확신이 안듭니다.
소셜로그인 중 서버 내에서 자동으로 리다이렉션 할 때 헤더 값은 원래 못가져오나요?아니면 프론트엔드에서 “http://localhost:8080/login/oauth2/code/kakao?code=” 엔드포인트를 캐치를 해서 헤더에 담긴 토큰을 가져오나요??
또 고민든게 추가정보 기입 페이지로 리다이렉션 할 때 이때도 인증/인가 검사를 해야한다고 생각합니다. 그럼 필터에서 요청 할 때마다 엔드포인트가 추가정보 기입 페이지 엔드포인트면 (String) request.getSession().getAttribute 로 토큰 값 꺼내고 아니면 헤더에서 값 꺼내고 모든 요청에 대한 엔드포인트를 비교하는것도 안좋다고 생각하는데 방법이 있을까요??
@Component
@RequiredArgsConstructor
public class OAuth2SuccessHandler implements AuthenticationSuccessHandler {
private final UserRepository userRepository;
private final TokenProvider tokenProvider;
private static final String SUCCESS_URI = "/api/v1/auth/success";
private static final String ADD_INFO_URI = "/api/v1/auth/add-info";
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
String id = authentication.getName();
User user = userRepository.findById(convertStringToLong(id)).orElseThrow(() -> new AuthException(NOT_EXIST_USER));
String uid = user.getUid();
String accessToken = tokenProvider.generateAccessToken(authentication);
String refreshToken = tokenProvider.generateRefreshToken(authentication);
request.getSession().setAttribute("accessToken", accessToken);
request.getSession().setAttribute("refreshToken", refreshToken);
if (uid == null) {
String addInfoRedirectUrl = UriComponentsBuilder.fromUriString(ADD_INFO_URI)
.build().toUriString();
response.sendRedirect(addInfoRedirectUrl);
return;
}
issueTokensAndRedirect(response, uid, user.getNickName(), user.getProfile());
}
public static void issueTokensAndRedirect(HttpServletResponse response, String uid, String nickName, String profile) throws IOException {
setValueInHeader(response, uid, nickName, profile);
String redirectUrl = UriComponentsBuilder.fromUriString(SUCCESS_URI)
.build().toUriString();
response.sendRedirect(redirectUrl);
}
public static void setValueInHeader(HttpServletResponse response, String uid, String nickName, String profile) {
response.setHeader(UID, uid);
response.setHeader(NICKNAME, nickName);
response.setHeader(PROFILE, profile);
}