diff --git a/src/main/java/com/mycom/socket/auth/config/SecurityConfig.java b/src/main/java/com/mycom/socket/auth/config/SecurityConfig.java index 0ecda28..5295378 100644 --- a/src/main/java/com/mycom/socket/auth/config/SecurityConfig.java +++ b/src/main/java/com/mycom/socket/auth/config/SecurityConfig.java @@ -20,7 +20,6 @@ public class SecurityConfig{ private final JWTUtil jwtUtil; - private final JWTProperties properties; private final MemberDetailsService memberDetailsService; @Bean @@ -32,7 +31,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .formLogin(AbstractHttpConfigurer::disable) .addFilterBefore( - new JWTFilter(properties, jwtUtil, memberDetailsService), + new JWTFilter(jwtUtil, memberDetailsService), UsernamePasswordAuthenticationFilter.class ) diff --git a/src/main/java/com/mycom/socket/auth/jwt/JWTFilter.java b/src/main/java/com/mycom/socket/auth/jwt/JWTFilter.java index d235d3d..b7074d9 100644 --- a/src/main/java/com/mycom/socket/auth/jwt/JWTFilter.java +++ b/src/main/java/com/mycom/socket/auth/jwt/JWTFilter.java @@ -1,10 +1,8 @@ package com.mycom.socket.auth.jwt; -import com.mycom.socket.auth.config.JWTProperties; import com.mycom.socket.auth.service.MemberDetailsService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; -import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -21,18 +19,22 @@ @RequiredArgsConstructor public class JWTFilter extends OncePerRequestFilter { - private final JWTProperties jwtProperties; + private final JWTUtil jwtUtil; private final MemberDetailsService memberDetailsService; + private static final String BEARER_PREFIX = "Bearer "; + private static final String TOKEN_TYPE = "ACCESS_TOKEN"; + @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { - String token = resolveTokenFromCookie(request); - if (StringUtils.hasText(token) && jwtUtil.validateToken(token, "ACCESS_TOKEN")) { - setAuthentication(token); + // Bearer 토큰 확인 + String bearerToken = resolveTokenFromHeader(request); + if (isValidBearerToken(bearerToken)) { + setAuthentication(bearerToken); } } catch (Exception e) { log.warn("인증 처리 실패", e); @@ -42,14 +44,10 @@ protected void doFilterInternal(HttpServletRequest request, filterChain.doFilter(request, response); } - private String resolveTokenFromCookie(HttpServletRequest request) { - Cookie[] cookies = request.getCookies(); - if (cookies != null) { - for (Cookie cookie : cookies) { - if (jwtProperties.getAccessTokenCookieName().equals(cookie.getName())) { - return cookie.getValue(); - } - } + private String resolveTokenFromHeader(HttpServletRequest request) { + String bearerToken = request.getHeader("Authorization"); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) { + return bearerToken.substring(7); } return null; } @@ -67,4 +65,10 @@ private void setAuthentication(String token) { SecurityContextHolder.getContext().setAuthentication(authentication); } + + private boolean isValidBearerToken(String token) { + return StringUtils.hasText(token) && + token.matches("^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.?[A-Za-z0-9-_.+/=]*$") && + jwtUtil.validateToken(token, TOKEN_TYPE); + } } \ No newline at end of file diff --git a/src/main/java/com/mycom/socket/go_socket/controller/ProfileController.java b/src/main/java/com/mycom/socket/go_socket/controller/ProfileController.java new file mode 100644 index 0000000..c7e37db --- /dev/null +++ b/src/main/java/com/mycom/socket/go_socket/controller/ProfileController.java @@ -0,0 +1,20 @@ +package com.mycom.socket.go_socket.controller; + +import com.mycom.socket.auth.security.MemberDetails; +import com.mycom.socket.go_socket.dto.response.ProfileResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/profile") +public class ProfileController { + + @GetMapping + public ProfileResponse getProfile(@AuthenticationPrincipal MemberDetails memberDetails) { + return ProfileResponse.of(memberDetails.getMember()); + } +} diff --git a/src/main/java/com/mycom/socket/go_socket/dto/response/ProfileResponse.java b/src/main/java/com/mycom/socket/go_socket/dto/response/ProfileResponse.java new file mode 100644 index 0000000..bf170f8 --- /dev/null +++ b/src/main/java/com/mycom/socket/go_socket/dto/response/ProfileResponse.java @@ -0,0 +1,17 @@ +package com.mycom.socket.go_socket.dto.response; + +import com.mycom.socket.go_socket.entity.Member; + +public record ProfileResponse( + String email, + String nickname, + String intro +) { + public static ProfileResponse of(Member member) { + return new ProfileResponse( + member.getEmail(), + member.getNickname(), + member.getIntro() + ); + } +} diff --git a/src/main/java/com/mycom/socket/go_socket/service/MemberService.java b/src/main/java/com/mycom/socket/go_socket/service/MemberService.java new file mode 100644 index 0000000..c1f09f1 --- /dev/null +++ b/src/main/java/com/mycom/socket/go_socket/service/MemberService.java @@ -0,0 +1,14 @@ +package com.mycom.socket.go_socket.service; + +import com.mycom.socket.go_socket.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberService { + + private final MemberRepository memberRepository; +} diff --git a/src/main/resources/yaml/application-dev.yml b/src/main/resources/yaml/application-dev.yml index 449e43e..de934b1 100644 --- a/src/main/resources/yaml/application-dev.yml +++ b/src/main/resources/yaml/application-dev.yml @@ -2,4 +2,4 @@ spring: jpa: show-sql: true hibernate: - ddl-auto: create \ No newline at end of file + ddl-auto: update \ No newline at end of file