1.나의 문제
Token이 만료되면 500번 에러가 나오게끔 코드를 작성했다.
프론트쪽에서 500번 에러가 날 때마다 서버에서 자꾸 액세스 토큰값을 요청한다고, 상태코드 401, 메세지 Authorization Failed으로 바꿔달라고 하셨다.
src/main/java/com/example/backend/filter/JwtAuthenticationFilter.java
catch (ExpiredJwtException e) {
request.setAttribute("exception", JwtExceptionCode.EXPIRED_TOKEN.getCode());
log.error("EXPIRED Token // token : {}", token);
log.error("Set Request Exception Code : {}", request.getAttribute("exception"));
throw new BadCredentialsException("throw new expired token exception");
}
에러가 발생하면 catch 문으로 이동해서 throw new 로 Exception을 발생시키고 500번 상태코드를 낸다.
포스트맨

2.나의 해결
catch (ExpiredJwtException e) {
request.setAttribute("exception", JwtExceptionCode.EXPIRED_TOKEN.getCode());
log.error("EXPIRED Token // token : {}", token);
log.error("Set Request Exception Code : {}", request.getAttribute("exception"));
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
ResponseDto errorResponse = new ResponseDto(ResponseCode.EXPIRED_TOKEN,ResponseMessage.EXPIRED_TOKEN);
new ObjectMapper().writeValue(response.getWriter(),errorResponse);
}
예외 발생을 시키지 않고 HttpservletResponse 에 상태코드와 메시지를 넣기로 했다.
2-1. HttpservletResponse 개념
HttpservletResponse 에 대해 간단히 짚고 넘어가겠다.
HttpservletResponse 의 역할
-HTTP 응답 메시지 생성
-응답 코드 지정(200, 300, 400, 500 등)
-바디 생성 가능
-여러 편의 기능 제공(Content-type, Cookie, Redirect)
코드 설명
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
ResponseDto errorResponse = new ResponseDto(ResponseCode.EXPIRED_TOKEN,ResponseMessage.EXPIRED_TOKEN);
new ObjectMapper().writeValue(response.getWriter(),errorResponse);
코드 순서대로 설명
1.HTTP 응답 메시지를 생성하기 위해 response.setStatus를 사용하여 500번 코드를 401 코드로 변경했다.
2.Servlet HTTP 응답데이터(Response) 를 JSON 으로 설정해서 응답받을 때 JSON 으로 받게끔 했다.
그러기위해 ContentType을 "application/json"으로 지정해야한다.
response.setContentType(APPLICATION_JSON_VALUE);
내가 코드를 참고한 블로그는 이렇게 했는데 미디어타입 맵핑을 이용한 것 같다. 지금 당장 소화하긴 힘들어서 모르는 코드를 쓰기보단 내가 이해한 코드인 "application/json"를 사용했다. 리팩토링할 때 이 부분에 대해 공부하고 바꿔봐야겠다. (**)
3.서블릿에서 화면에 데이터를 출력하기 위해서는 out.println을 사용을 하는데 이 코드 없이 out.print("한글");를 하면 '한글'이 아니라 ??? 와 같은 물음표가 출력된다. 한글 깨지지 않도록 하기 위해 설정한 코드다.
4.에러를 설명하는 코드와 메세지를 보여주기 위해 객체에 담았다.
5.ObjectMapper를 이용하여 JSON을 Java 객체로 변환할 수 있고, 반대로 Java 객체를 JSON 객체로 serialization(직렬화)할 수 있다. 나는 Java객체를 JSON 으로 serialization하기 위해서 writeValue() 메서드를 이용한다. writeValue()의 파라미터로 저장할 파일과 직렬화시킬 객체를 넣어주면 된다.
objectMapper.writeValue(new File("src/person.json"), person);
예시코드다.
나는 첫번째 인자에 response.getWriter()을 넣었다. response객체 안에 Writer를 담당하는 객체가 또 있는 형태다. response.getWriter()에 대한 인프런김영한답변
두번째 인자에 4번에서 만든 errorResponse를 넣었다.(직렬화시킬 객체)
첫번째 인자에 대한 이해가 좀 부족해서 ObjectMapper에 대한 추가 공부가 필요하다.(**)
포스트맨

깃허브에서 코드 전문을 볼 수 있습니다.
공부하면서 작성한 코드입니다. 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다.
참고자료
https://hungseong.tistory.com/67
https://loopstudy.tistory.com/169
https://cbw1030.tistory.com/62
'Springboot' 카테고리의 다른 글
| Spring boot 구글 소셜로그인 OAuth 로그인 구현 (0) | 2024.01.10 |
|---|---|
| Spring boot github 잔디같은 기능을 프로젝트에 구현하자 (0) | 2024.01.04 |
| 홍팍 스프링부트 6 (0) | 2023.08.03 |
| Spring 홍팍 스프링부트, 입문 강의 기록 3 (0) | 2023.08.03 |
| Spring 홍팍 스프링부트, 입문 강의 기록 2 (0) | 2023.08.03 |