개요
사용자의 로그인 시 JWT 토큰을 응답 본문으로 반환하는 대신, HTTP-Only 쿠키에 저장하여 보안성을 강화합니다. 이를 통해 XSS 공격에 대한 방어를 강화하고, 클라이언트 측에서 토큰을 직접 다루지 않도록 합니다.
수정 사항
작업 내용
세부 내용
-
JwtTokenProvider 수정:
- JWT 토큰을 쿠키에 추가하는
addTokenToCookie 메서드 추가
- 로그아웃 시 쿠키를 무효화하는
invalidateCookie 메서드 추가
public void addTokenToCookie(String token, HttpServletResponse response) {
Cookie cookie = new Cookie("JWT_TOKEN", token);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge((int) (validityInMilliseconds / 1000));
response.addCookie(cookie);
}
public void invalidateCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("JWT_TOKEN", null);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
-
LoginService 수정:
- 로그인 성공 시 JWT 토큰을 생성한 후
addTokenToCookie 메서드를 호출하여 쿠키에 저장하도록 변경
public ApiResponse<LoginResponseDto> login(LoginDto loginDto, HttpServletResponse response) {
// ... (기존 로그인 검증 로직)
String token = jwtTokenProvider.createToken(user.getEmail());
// 쿠키에 JWT 토큰 저장
jwtTokenProvider.addTokenToCookie(token, response);
// 응답 DTO에서 토큰 제거
LoginResponseDto responseDto = new LoginResponseDto(getMessage("login.success"));
return new ApiResponse<>(
200,
getMessage("login.success"),
responseDto
);
}
-
LoginController 수정:
- 로그인 API에서
HttpServletResponse를 파라미터로 받아 로그인 서비스 호출 시 전달
@PostMapping("/login")
public ApiResponse<LoginResponseDto> login(@RequestBody @Valid LoginDto loginDto, HttpServletResponse response) {
return authenticationService.login(loginDto, response);
}
응답 형식
{
"status": 200,
"message": "로그인 성공",
"data": {
"success": true,
"message": "로그인 성공"
}
}
{
"status": 400,
"message": "로그인 실패",
"data": null
}
참고
- 보안: JWT 토큰을 HTTP-Only 쿠키에 저장하여 XSS 공격 방어 강화
- 유효성 검사: @Valid를 통한 DTO 유효성 검증
- 예외처리: CustomException과 GlobalExceptionHandler를 통한 통합 예외 처리
개요
사용자의 로그인 시 JWT 토큰을 응답 본문으로 반환하는 대신, HTTP-Only 쿠키에 저장하여 보안성을 강화합니다. 이를 통해 XSS 공격에 대한 방어를 강화하고, 클라이언트 측에서 토큰을 직접 다루지 않도록 합니다.
수정 사항
작업 내용
세부 내용
JwtTokenProvider 수정:
addTokenToCookie메서드 추가invalidateCookie메서드 추가LoginService 수정:
addTokenToCookie메서드를 호출하여 쿠키에 저장하도록 변경LoginController 수정:
HttpServletResponse를 파라미터로 받아 로그인 서비스 호출 시 전달응답 형식
{ "status": 200, "message": "로그인 성공", "data": { "success": true, "message": "로그인 성공" } }{ "status": 400, "message": "로그인 실패", "data": null }참고