11package com .waitit .capstone .global .security .jwt ;
22
3- import com .waitit .capstone .domain .auth .dto .LoginRequest ;
43import com .fasterxml .jackson .databind .ObjectMapper ;
4+ import com .waitit .capstone .domain .auth .dto .LoginRequest ;
5+ import com .waitit .capstone .domain .auth .dto .LoginResponseDto ;
56import com .waitit .capstone .domain .auth .service .RefreshTokenService ;
67import jakarta .servlet .FilterChain ;
78import jakarta .servlet .ServletInputStream ;
89import jakarta .servlet .http .Cookie ;
910import jakarta .servlet .http .HttpServletRequest ;
1011import jakarta .servlet .http .HttpServletResponse ;
11- import java .io .IOException ;
12- import java .nio .charset .StandardCharsets ;
13- import lombok .AllArgsConstructor ;
1412import lombok .extern .slf4j .Slf4j ;
1513import org .springframework .http .HttpStatus ;
1614import org .springframework .security .authentication .AuthenticationManager ;
2018import org .springframework .security .web .authentication .UsernamePasswordAuthenticationFilter ;
2119import org .springframework .util .StreamUtils ;
2220
21+ import java .io .IOException ;
22+ import java .nio .charset .StandardCharsets ;
23+
2324@ Slf4j
24- @ AllArgsConstructor
2525public class LoginFilter extends UsernamePasswordAuthenticationFilter {
2626
2727 private final AuthenticationManager authenticationManager ;
2828 private final JWTUtil jwtUtil ;
2929 private final RefreshTokenService refreshTokenService ;
30+ private final ObjectMapper objectMapper ;
31+
32+ public LoginFilter (AuthenticationManager authenticationManager , JWTUtil jwtUtil , RefreshTokenService refreshTokenService , ObjectMapper objectMapper ) {
33+ this .authenticationManager = authenticationManager ;
34+ this .jwtUtil = jwtUtil ;
35+ this .refreshTokenService = refreshTokenService ;
36+ this .objectMapper = objectMapper ;
37+ }
3038
3139 @ Override
3240 public Authentication attemptAuthentication (HttpServletRequest request , HttpServletResponse response )
3341 throws AuthenticationException {
34- // 클라이언트 요청에서 username, password 추출
3542 LoginRequest loginRequest = new LoginRequest ();
36-
3743 try {
38- ObjectMapper objectMapper = new ObjectMapper ();
3944 ServletInputStream inputStream = request .getInputStream ();
4045 String messageBody = StreamUtils .copyToString (inputStream , StandardCharsets .UTF_8 );
4146 loginRequest = objectMapper .readValue (messageBody , LoginRequest .class );
@@ -47,63 +52,57 @@ public Authentication attemptAuthentication(HttpServletRequest request, HttpServ
4752
4853 String username = loginRequest .getUsername ();
4954 String password = loginRequest .getPassword ();
50- // 인증을 위해 토큰으로 변환
51- UsernamePasswordAuthenticationToken token =
52- new UsernamePasswordAuthenticationToken (username , password , null );
53-
55+ UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken (username , password , null );
5456 return authenticationManager .authenticate (token );
5557 }
5658
57- // 로그인 성공 시 실행하는 메소드 (여기서 JWT를 발급하면 됨)
5859 @ Override
5960 protected void successfulAuthentication (HttpServletRequest request , HttpServletResponse response ,
6061 FilterChain chain , Authentication authentication ) throws IOException {
61- String username = authentication .getName ();
62+ String phoneNumber = authentication .getName ();
6263 String role = authentication .getAuthorities ().iterator ().next ().getAuthority ();
63- String name = refreshTokenService .findMember (username );
64+ String name = refreshTokenService .findMember (phoneNumber );
6465 long accessExpireMs = 600000L ;
6566 long refreshExpireMs = 86400000L ;
6667
67- String access = jwtUtil .createJwt ("access" , username , role , accessExpireMs );
68- String refresh = jwtUtil .createJwt ("refresh" , username , role , refreshExpireMs );
69-
70- // Refresh 토큰 저장
71- refreshTokenService .save (username , refresh , refreshExpireMs );
68+ String access = jwtUtil .createJwt ("access" , phoneNumber , role , accessExpireMs );
69+ String refresh = jwtUtil .createJwt ("refresh" , phoneNumber , role , refreshExpireMs );
7270
73- // 클라이언트 타입 구분
74- String clientType = request .getHeader ("X-Client-Type" );
71+ refreshTokenService .save (phoneNumber , refresh , refreshExpireMs );
7572
76- // 공통: access token은 헤더에 설정 (REST 표준)
7773 response .setHeader ("Authorization" , "Bearer " + access );
74+ response .setContentType ("application/json" );
75+ response .setCharacterEncoding ("UTF-8" );
76+
77+ String clientType = request .getHeader ("X-Client-Type" );
78+ LoginResponseDto loginResponse ;
7879
7980 if ("mobile" .equalsIgnoreCase (clientType )) {
80- // 모바일: JSON 응답
81- String jsonResponse = "{\" message\" : \" 로그인에 성공했습니다.\" , " +
82- "\" username\" : \" " + username + "\" , " +
83- "\" name\" : \" " + name + "\" , " +
84- "\" role\" : \" " + role + "\" , " +
85- "\" refresh\" : \" " + refresh + "\" }" ;
86- response .setContentType ("application/json" );
87- response .setCharacterEncoding ("UTF-8" );
88- response .getWriter ().write (jsonResponse );
81+ loginResponse = LoginResponseDto .builder ()
82+ .message ("로그인에 성공했습니다." )
83+ .phoneNumber (phoneNumber )
84+ .name (name )
85+ .role (role )
86+ .refresh (refresh )
87+ .build ();
8988 } else {
90- // 웹: HttpOnly 쿠키로 refresh 토큰 전달
9189 Cookie refreshCookie = jwtUtil .createCookie ("refresh" , refresh );
9290 refreshCookie .setSecure (true );
9391 refreshCookie .setPath ("/" );
9492 response .addCookie (refreshCookie );
95- String jsonResponse = "{\" message\" : \" 로그인에 성공했습니다.\" , " +
96- "\" username\" : \" " + username + "\" , " +
97- "\" name\" : \" " + name + "\" , " +
98- "\" role\" : \" " + role + "\" }" ;
99- response .setContentType ("application/json" );
100- response .setCharacterEncoding ("UTF-8" );
101- response .getWriter ().write (jsonResponse );
102- response .setStatus (HttpStatus .OK .value ());
93+
94+ loginResponse = LoginResponseDto .builder ()
95+ .message ("로그인에 성공했습니다." )
96+ .phoneNumber (phoneNumber )
97+ .name (name )
98+ .role (role )
99+ .build ();
103100 }
101+
102+ response .getWriter ().write (objectMapper .writeValueAsString (loginResponse ));
103+ response .setStatus (HttpStatus .OK .value ());
104104 }
105105
106- // 로그인 실패 시 실행하는 메소드
107106 @ Override
108107 protected void unsuccessfulAuthentication (HttpServletRequest request , HttpServletResponse response ,
109108 AuthenticationException failed ) throws IOException {
0 commit comments