-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
개요
사용자의 로그인 시 JWT 토큰을 응답 본문으로 반환하는 대신, HTTP-Only 쿠키에 저장하여 보안성을 강화합니다. 이를 통해 XSS 공격에 대한 방어를 강화하고, 클라이언트 측에서 토큰을 직접 다루지 않도록 합니다.
수정 사항
작업 내용
- JWT 토큰 생성 후 응답 방식 변경:
- 로그인 성공 시 발급된 JWT 토큰을 HTTP-Only 쿠키에 저장하도록 변경
- 기존의 응답 본문에서 JWT 토큰을 제거
세부 내용
-
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); }
- JWT 토큰을 쿠키에 추가하는
-
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 ); }
- 로그인 성공 시 JWT 토큰을 생성한 후
-
LoginController 수정:
- 로그인 API에서
HttpServletResponse를 파라미터로 받아 로그인 서비스 호출 시 전달
@PostMapping("/login") public ApiResponse<LoginResponseDto> login(@RequestBody @Valid LoginDto loginDto, HttpServletResponse response) { return authenticationService.login(loginDto, response); }
- 로그인 API에서
응답 형식
- 성공 응답:
{
"status": 200,
"message": "로그인 성공",
"data": {
"success": true,
"message": "로그인 성공"
}
}- 실패 응답:
{
"status": 400,
"message": "로그인 실패",
"data": null
}참고
- 보안: JWT 토큰을 HTTP-Only 쿠키에 저장하여 XSS 공격 방어 강화
- 유효성 검사: @Valid를 통한 DTO 유효성 검증
- 예외처리: CustomException과 GlobalExceptionHandler를 통한 통합 예외 처리
Metadata
Metadata
Assignees
Labels
No labels