더보기
프로젝트는 잘 마무리 되었으나.. 딱 이시점부터 문제가 쌓이기 시작해 블로그에 글을 차마 남기지 못하였습니다. 늦었지만 지금이라도 차근차근 정리해둬야 나중에 기억하고 추억할 수 있을것 같아 그때의 생각을 되짚어 보며 차츰차츰 정리해두도록 하겠습니다.
앞서 Spring Security, Mybatis, JWT 를 활용하여 회원가입 로그인 기능을 구현하는 중 Postman 으로는 토큰 발급을 받아 잘 전달해주는 것까지 확인하였었습니다. 이번 포스팅에서는 발급된 토큰을 헤더에 집어넣어 보내는 과정에서 HTML 에서 해당 토큰을 받지 못하는 오류가 발생하였고, 어떤 판단을 내려 해결하였는지 작성하겠습니다.
변수발생 !
@RequiredArgsConstructor
public class JWTFilter extends OncePerRequestFilter {
// JWT 필터 검증
private final JWTUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//request 에서 Authorization 헤더를 찾음
String authorization = request.getHeader("Authorization");
//System.out.println(authorization);
//Authorization 헤더 검증
if (authorization == null || !authorization.startsWith("Bearer ")) {
System.out.println("token null");
filterChain.doFilter(request, response);
// 조건이 해당되면 메소드 종료 (필수)
return;
}
String token = authorization.split(" ")[1];
// 토큰 소멸 시간 검증
if (jwtUtil.isExpired(token)) {
System.out.println("token expired");
filterChain.doFilter(request, response);
// 조건이 해당되면 메소드 종료 (필수)
return;
}
// 토큰에서 username 과 role 획득
String username = jwtUtil.getUsername(token);
String role = jwtUtil.getRoles(token);
// memberDto 를 생성하여 값 set
MemberDto memberDto = new MemberDto();
memberDto.setEmail(username);
memberDto.setPassword("tempPassword");
memberDto.setRoles(role);
//UserDetails 에 회원 정보 객체 담기
CustomUserDetails customUserDetails = new CustomUserDetails(memberDto);
//스프링 시큐리티 인증 토큰 세션
Authentication authToken = new UsernamePasswordAuthenticationToken(customUserDetails, null, customUserDetails.getAuthorities());
//세션에 사용자 등록
SecurityContextHolder.getContext().setAuthentication(authToken);
filterChain.doFilter(request, response);
}
}
임의로 저장한 아이디와 비밀번호를 통해 로그인 하였을 경우, Postman 에서는 200 OK 를 출력해주었고 Authorization 에 JWT 토큰이 발급된 것을 확인하였습니다. 발급된 토큰을 가지고 Postman 에서 로그인을 시도해보니,JWTFilter 부분에서 Authorization 헤더 검증을 하는 코드에서 "token null" 을 출력시켰습니다. 토큰이 잘못되었나 싶어 해당 토큰 값을 디코딩 하여 보니 제대로 출력 되는 것을 확인하였습니다.
토큰 발급에는 문제가 없으나 헤더 검증 코드에서 null 값을 출력했던 것은 헤더에 토큰이 담기지 않았다는 것인데, 도데체 어디서 값이 세어나가고 있는지 이해가 안되서 도움을 요청한 순간. 여러가지 해결방법들을 들었는데..
해결 방안 제시
- RESTful API 를 포기하고 model 객체를 활용해라.
- JWT 토큰을 헤더에 넣어 전달하고자 하려면 프론트 서버를 따로 구축해야한다. (Redis 또는 React 사용)
해결 하기 위한 노력
- 이 다음에 배우는 것이 React 였기 때문에 JSON 형태의 파일을 ajax 로 통신하는 방법을 연습 해보고자 하였음. 따라서 JWT 를 JSON 형식으로 파싱하여 보내기로 하였으나 파싱의 코드가 틀렸는지 계속해서 null 값을 출력 시켰음.
- 당장 Redis 를 공부하여 따로 구축하는게 현실적으로 어려웃것 같다는 판단.
결과적으로는 발급받은 JWT 토큰을 JSON 으로 파싱하여 보내는 과정 (1번)에서 삽질을 너무 오랫동안 하였고, 인증 인가의 로그인 방식이 빨리 해결되야 팀원들이 해당 페이지를 구현할 수 있다는 얘기가 들려와 다음에 사용해보는 것으로 하고 Spring Security 의 인증 인가 방식만 사용하였습니다.
'Project > DevCampUs' 카테고리의 다른 글
[Semi-Project]로그인 기능 구현(9) (0) | 2024.07.21 |
---|---|
[Semi-Project]회원가입 기능 구현(8) (0) | 2024.07.21 |
[Semi-Project]Spring Security & JWT & OAuth2(6) (0) | 2024.06.23 |
[Semi-Project]Jenkins 를 통한 배포 (5) (0) | 2024.06.21 |
[Semi-Project]thymeleaf & layout (4) (0) | 2024.06.21 |