Skip to content

[BE] AuthService: JWT 토큰을 쿠키에 저장하는 방식으로 변경 #14

@jiva-z

Description

@jiva-z

개요

사용자의 로그인 시 JWT 토큰을 응답 본문으로 반환하는 대신, HTTP-Only 쿠키에 저장하여 보안성을 강화합니다. 이를 통해 XSS 공격에 대한 방어를 강화하고, 클라이언트 측에서 토큰을 직접 다루지 않도록 합니다.


수정 사항

작업 내용

  • JWT 토큰 생성 후 응답 방식 변경:
    • 로그인 성공 시 발급된 JWT 토큰을 HTTP-Only 쿠키에 저장하도록 변경
    • 기존의 응답 본문에서 JWT 토큰을 제거

세부 내용

  1. 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);
    }
  2. 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
        );
    }
  3. 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를 통한 통합 예외 처리

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions