쿠키에서 JWT를 검증할 때 Bearer
처리가 문제되는 이유는 헤더와 쿠키가 데이터를 다루는 방식이 다르기 때문입니다. 이를 더 구체적으로 설명하겠습니다.
Authorization
헤더에 JWT를 Bearer {토큰}
형태로 추가합니다.Bearer
라는 접두사는 인증 방식의 유형을 나타내며, JWT 라이브러리나 유틸리티에서 이를 고려해 처리할 수 있도록 설계됩니다.Authorization=Bearer eyJhbGciOiJIUzI1NiJ9...
Bearer
접두사도 그대로 인코딩됩니다.Authorization
헤더에서 JWT를 가져올 때, 값은 원래 상태(Bearer eyJhb...
)로 저장되므로 Bearer
접두사를 단순히 제거하면 됩니다.Bearer
와 공백(%20
)도 인코딩되어 저장됩니다.Bearer eyJhb...
→ Bearer%20eyJhb...
Bearer
접두사가 그대로 포함되어 있어 검증이 실패하거나, 디코딩 오류가 발생할 수 있습니다.%20
로 남아 있거나, 인코딩된 Bearer
를 처리하지 않으면 JWT의 유효성 검증 과정에서 문제가 생깁니다.Bearer
접두사와 공백을 제거해야 합니다.public String getTokenFromRequest(HttpServletRequest req) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("Authorization")) {
try {
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
if (value.startsWith("Bearer ")) {
return value.substring(7); // Bearer 제거
}
} catch (UnsupportedEncodingException e) {
return null;
}
}
}
}
return null;
}
Bearer
제외Bearer
접두사를 포함하지 않고 순수한 토큰 값만 저장하는 방법도 있습니다.substring
처리가 필요 없으므로 코드가 단순해집니다.public void addJwtToCookie(String token, HttpServletResponse res) {
try {
String encodedToken = URLEncoder.encode(token, "UTF-8");
Cookie cookie = new Cookie("Authorization", encodedToken);
cookie.setPath("/");
res.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
log.error(e.getMessage());
}
}
Bearer {토큰}
구조를 유지하며, 인증 방식 정보(Bearer
)와 토큰 값을 동시에 제공.Bearer
접두사를 제거해야 함.이 차이는 JWT를 사용하는 목적과 데이터 전달 방식의 차이에서 비롯됩니다. 쿠키를 사용할 때는 이러한 추가 처리가 필요하므로 코드 작성 시 유의해야 합니다.