JWT (JSON Web Token)

JSON 객체를 사용하여 정보를 안전하게 전송하기 위한 표준.

JWT 구조

header.payload.signature

  1. Header: 토큰 타입, 해싱 알고리즘 정보 포함.
  2. Payload: 클레임(claim) 정보를 포함. 클레임은 토큰에 포함된 정보 조각.
  3. Signature: 헤더와 페이로드가 비밀키로 서명되어 저장.

장점

JWT는 필요한 모든 정보를 자체적으로 포함.

  1. 페이로드(payload)에 사용자 정보, 권한 등 필요한 데이터를 포함시킬 수 있음. →

  2. 각 요청에 토큰이 포함되므로 서버는 해당 토큰만으로 요청의 유효성과 사용자의 정보를 확인할 수 있다.

    ⇒ 확장성이 향상.

단점

  1. 토큰 크기:
  2. 보안

Controller에서 사용자 정보를 받아오기

Interceptor

크레덴셜이 필요한 요청이 들어온 경우, 토큰으로부터 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;
		}
	}