개요
시큐리티 공부를 진행하다 문득 JWT 토큰을 왜 HTTP 헤더로 전송해야 할까 궁금해졌습니다. 이번 포스팅에서 이유에 대해 살펴보겠습니다.
1. 보안
헤더로 토큰을 전송하는 것은 URL이나 바디로 전송하는 것보다 보안적으로 더 안전합니다. URL에 토큰을 포함하여 전송할 경우, 브라우저의 히스토리나 서버 로그, 리퍼러 로그에 토큰 정보가 저장될 위험이 있습니다. 반면에, 헤더로 전송되는 토큰은 이러한 로깅의 위험에서 비교적 안전합니다.
앞 전의 포스트에서 작성했던 코드 또한 다음과 같이 수정하였습니다.
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// String accessToken = webRequest.getParameter("AccessToken");
String accessToken = webRequest.getHeader("Authorization");
if (accessToken == null || accessToken.equals("")) {
throw new UnAuthorizedException("권한이 없습니다.");
}
UserSession userSession = new UserSession();
userSession.id = 1L;
return userSession;
}
Java
복사
2. 일관성
JWT와 같은 토큰 기반 인증을 사용하는 API는 일반적으로 모든 요청에서 인증 헤더를 기대합니다. 태초부터 공식 표준으로 이를 정의해왔기 때문인데요, 일관된 규칙을 사용함으로써 표준화된 형식을 기대할 수 있으며, 토큰의 위치를 쉽게 예측할 수 있습니다.
3. 표준화
JWT는 Authorization 헤더와 Bearer 스키마를 사용하여 전송되는 것이 일반적입니다. 이런 방식은 웹 표준에 근거하며, 다양한 라이브러리나 서비스에서 널리 지원됩니다.
4. 유연성
토큰을 헤더에 포함시킴으로써, 요청 본문은 실제 데이터 전송을 위한 목적에만 집중할 수 있습니다. 이렇게 함으로써 요청의 본문과 인증 데이터가 명확하게 분리되어 유연한 API 설계가 가능해집니다.