JSON 객체를 사용하여 정보를 안전하게 전송하기 위한 표준.
header.payload.signature
JWT는 필요한 모든 정보를 자체적으로 포함.
페이로드(payload)에 사용자 정보, 권한 등 필요한 데이터를 포함시킬 수 있음. →
각 요청에 토큰이 포함되므로 서버는 해당 토큰만으로 요청의 유효성과 사용자의 정보를 확인할 수 있다.
⇒ 확장성이 향상.
크레덴셜이 필요한 요청이 들어온 경우, 토큰으로부터 Clams 정보를 가져온다.
이 과정에서 만료기간이 지난 토큰, 위변조 토큰의 경우 클레임을 가져오는 과정에서 InvalidTokenException이 발생한다.
클레임으로부터 사용자 ID와 이름 정보를 request attribute에 넣어준다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (allowedMethod.contains(request.getMethod())) {
return true;
}
try {
String jwtToken = request.getHeader(AUTHORIZATION).substring(BEARER.length());
Map<String, Object> claims = tokenProvider.getClaimsFromToken(jwtToken);
request.setAttribute(USER_ID, claims.get(SUBJECT));
request.setAttribute(USER_NAME, claims.get(USER_NAME));
return true;
} catch (InvalidTokenException e) {
sendErrorResponse(response, HttpStatus.UNAUTHORIZED, InvalidTokenException.INVALID_TOKEN_EXCEPTION);
return false;
} catch (RuntimeException e) {
sendErrorResponse(response, HttpStatus.BAD_REQUEST, BAD_REQUEST_ERROR_MESSAGE);
return false;
}
}