TIL

(2024-06-10) 팀과제 마무리

o_coding 2024. 6. 11. 16:35

팀과제 코드를 다 완성해서 문제있는지 테스트 해보고  메인 브랜치에 올렸다.

진행중에 요구사항을 잘못파악해서 쿠키에 토큰을 저장했는대 팀원 분께서 헤더로 저장 되게 다시 변경하셔서 로그아웃 이랑 회원탈퇴 부분에서 토큰을 헤더에서 삭제 하게 수정했다. 

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if("/api/user/logout".equals(request.getRequestURI()) &&"POST".equalsIgnoreCase(request.getMethod())){
// 모든 헤더를 로그에 출력
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
log.info("Header Name: {}, Header Value: {}", headerName, headerValue);
}
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if(auth!= null){
new SecurityContextLogoutHandler().logout(request,response,auth);
}
//헤더에서 토큰 삭제
response.setHeader(jwtUtil.AUTHORIZATION_HEADER,"");

//user 엔티티에서 refresh토큰 삭제
String userId = request.getHeader("userId");
log.info(userId);
userService.updateRefreshToken(userId,null);
response.setCharacterEncoding("UTF-8");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write("로그아웃 성공");
log.info("로그아웃 성공");
return;
}
filterChain.doFilter(request,response);
}

로그아웃

 

@Transactional
public void withdrawal(LoginRequestDto loginRequestDto, HttpServletResponse res) throws ServletException, IOException { //회원삭제에 필요한 필드와 로그인에 필요한 필드가 동일함으로 dto재사용
System.out.println("회원탈퇴 서비스 진입");
Optional<User> optionalUser = userRepository.findByUserId(loginRequestDto.getUserId());
if (optionalUser.isPresent()){
User user = optionalUser.get();
if(passwordEncoder.matches(loginRequestDto.getPassword(),user.getPassword())){
user.withdhrawnStatus();
user.updateToken("");
userRepository.save(user);
SecurityContextHolder.clearContext(); // 현재 사용자의 인증 정보를 제거
JwtUtil jwtUtil = new JwtUtil();
//헤더에서 토큰 제거
res.setHeader(jwtUtil.AUTHORIZATION_HEADER,"");

}else{
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다");
}
}else{
throw new UsernameNotFoundException("사용자를 찾을 수 없거나 비밀번호가 일치하지 않습니다.");
}
}

회원 탈퇴

 

그리고 유저서비스에 리프레시토큰을 db에 저장하도록 기능을 구현했다.

@Transactional
public void updateRefreshToken(String userId,String refreshToekn){
User user = userRepository.findByUserId(userId).orElseThrow(()->new UsernameNotFoundException("존재하지 않는 유저입니다."));
user.updateToken(refreshToekn);
userRepository.save(user);
}