Skip to content

Commit 09036ba

Browse files
committed
feat: 로그인/로그아웃 기능 프론트 연동
1 parent 77c7c53 commit 09036ba

File tree

4 files changed

+69
-55
lines changed

4 files changed

+69
-55
lines changed
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
package cmf.commitField.domain.user.controller;
22

3+
import jakarta.servlet.http.Cookie;
34
import jakarta.servlet.http.HttpServletRequest;
45
import jakarta.servlet.http.HttpServletResponse;
56
import org.springframework.stereotype.Controller;
6-
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.PostMapping;
78

89
import java.io.IOException;
910

1011
@Controller
1112
public class LogoutController {
1213

13-
@GetMapping("/logout")
14+
@PostMapping("/api/logout")
1415
public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
16+
// 세션 만료
1517
request.getSession().invalidate();
16-
response.sendRedirect("/");
18+
19+
// 세션 쿠키 삭제
20+
Cookie cookie = new Cookie("JSESSIONID", null);
21+
cookie.setPath("/"); // 기본 경로 설정
22+
cookie.setMaxAge(0); // 쿠키 만료 시간 설정
23+
response.addCookie(cookie);
24+
25+
// CORS 대응을 위해 상태 코드만 반환하고, 프론트에서 리디렉션 처리하도록 함
26+
response.setStatus(HttpServletResponse.SC_OK);
1727
}
18-
}
28+
}

src/main/java/cmf/commitField/global/config/AppConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ public class AppConfig {
1111
@Getter
1212
private static String siteCookieDomain;
1313

14-
@Value("${custom.site.frontUrl}")
14+
@Value("${custom.dev.frontUrl}")
1515
public void setSiteFrontUrl(String siteFrontUrl) {
1616
this.siteFrontUrl = siteFrontUrl;
1717
}
18-
@Value("${custom.site.backUrl}")
18+
@Value("${custom.dev.backUrl}")
1919
public void setSiteBackUrl(String siteBackUrl) {
2020
this.siteBackUrl = siteBackUrl;
2121
}
22-
@Value("${custom.site.cookieDomain}")
22+
@Value("${custom.dev.cookieDomain}")
2323
public void setSiteCookieDomain(String siteCookieDomain) {
2424
this.siteCookieDomain = siteCookieDomain;
2525
}
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
package cmf.commitField.global.config;
22

33
import org.springframework.context.annotation.Configuration;
4-
import org.springframework.web.servlet.config.annotation.CorsRegistry;
54
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
65

76
@Configuration
87
public class CustomWebMvcConfig implements WebMvcConfigurer {
9-
@Override
10-
public void addCorsMappings(CorsRegistry registry) {
11-
registry.addMapping("/**")
12-
.allowedOrigins(
13-
AppConfig.getSiteFrontUrl()
14-
)
15-
.allowedMethods("*")
16-
.allowedHeaders("*")
17-
.allowCredentials(true)
18-
.maxAge(3600);
19-
}
8+
// @Override
9+
// public void addCorsMappings(CorsRegistry registry) {
10+
// registry.addMapping("/**")
11+
// .allowedOrigins(
12+
// AppConfig.getSiteFrontUrl()
13+
// )
14+
// .allowedMethods("*")
15+
// .allowedHeaders("*")
16+
// .allowCredentials(true)
17+
// .maxAge(3600);
18+
// }
2019
}
Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package cmf.commitField.global.security;
22

3-
import cmf.commitField.domain.user.entity.CustomOAuth2User;
43
import cmf.commitField.domain.user.service.CustomOAuth2UserService;
4+
import jakarta.servlet.http.HttpServletResponse;
55
import org.springframework.context.annotation.Bean;
66
import org.springframework.context.annotation.Configuration;
77
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -11,6 +11,11 @@
1111
import org.springframework.security.core.context.SecurityContextHolder;
1212
import org.springframework.security.oauth2.core.user.OAuth2User;
1313
import org.springframework.security.web.SecurityFilterChain;
14+
import org.springframework.web.cors.CorsConfiguration;
15+
import org.springframework.web.cors.CorsConfigurationSource;
16+
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
17+
18+
import java.util.List;
1419

1520
@Configuration
1621
@EnableWebSecurity
@@ -23,56 +28,56 @@ public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
2328

2429
@Bean
2530
protected SecurityFilterChain config(HttpSecurity http) throws Exception {
26-
//로그인 관련 설정
2731
http
32+
.cors(cors -> cors.configurationSource(corsConfigurationSource())) // CORS 설정 추가
33+
.csrf(AbstractHttpConfigurer::disable) // CSRF 보호 비활성화
34+
.sessionManagement(session -> session
35+
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 세션 정책 설정
36+
.invalidSessionUrl("/login?error=invalidSession") // 세션이 유효하지 않으면 이동할 URL
37+
.maximumSessions(1) // 하나의 계정으로 한 번에 로그인할 수 있도록 제한
38+
.expiredUrl("/login?error=sessionExpired") // 세션 만료 후 이동할 URL 설정
39+
)
2840
.oauth2Login(oauth2 -> oauth2
2941
.loginPage("/login") // 로그인 페이지 지정
3042
.successHandler((request, response, authentication) -> {
31-
// 인증 정보가 SecurityContext에 추가되는 것을 보장
3243
SecurityContextHolder.getContext().setAuthentication(authentication);
3344

34-
CustomOAuth2User customUser = (CustomOAuth2User) authentication.getPrincipal();
45+
OAuth2User principal = (OAuth2User) authentication.getPrincipal();
46+
String username = principal.getAttribute("login");
3547

36-
// 디버깅: authentication 정보 확인
37-
System.out.println("Authentication: " + authentication);
38-
System.out.println("Principal: " + authentication.getPrincipal());
48+
// 디버깅 로그
49+
System.out.println("OAuth2 로그인 성공: " + username);
3950

40-
if (authentication != null && authentication.getPrincipal() != null) {
41-
//인가가 있으면 유저 정보를 저장
42-
OAuth2User principal = (OAuth2User) authentication.getPrincipal();
43-
String username = principal.getAttribute("login");
44-
45-
// 세션에 사용자 정보를 추가
46-
request.getSession().setAttribute("user", username);
47-
48-
response.sendRedirect("/"); // 로그인 성공 후 리다이렉트
49-
} else {
50-
// 인증 실패 시 처리
51-
response.sendRedirect("/login?error=authenticationFailed");
52-
}
51+
response.sendRedirect("http://localhost:5173/home"); // 로그인 성공 후 리다이렉트
5352
})
5453
)
55-
.sessionManagement(session -> session
56-
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 세션 정책 설정
57-
.invalidSessionUrl("/login?error=invalidSession") // 세션이 유효하지 않으면 이동할 URL
58-
.maximumSessions(1) // 하나의 계정으로 한 번에 로그인할 수 있도록 제한
59-
.expiredUrl("/login?error=sessionExpired") // 세션 만료 후 이동할 URL 설정
60-
);
61-
62-
//로그아웃 관련 설정
63-
http
6454
.logout(logout -> logout
65-
.logoutUrl("/logout") // 로그아웃 URL 설정
66-
.logoutSuccessUrl("/") // 로그아웃 성공 후 이동할 URL
55+
.logoutUrl("api/logout") // 로그아웃 URL 설정
6756
.invalidateHttpSession(true) // 로그아웃 시 세션 무효화
6857
.clearAuthentication(true) // 인증 정보 지우기
6958
.deleteCookies("JSESSIONID") // 세션 쿠키 삭제
70-
);
71-
http
72-
.csrf(
73-
AbstractHttpConfigurer::disable // CSRF 보호 비활성화
59+
.logoutSuccessHandler((request, response, authentication) -> {
60+
System.out.println("로그아웃 성공");
61+
response.setStatus(HttpServletResponse.SC_OK);
62+
response.sendRedirect("http://localhost:5173/"); // 로그아웃 후 홈으로 이동
63+
})
7464
);
7565

7666
return http.build();
7767
}
78-
}
68+
69+
@Bean
70+
public CorsConfigurationSource corsConfigurationSource() {
71+
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
72+
CorsConfiguration config = new CorsConfiguration();
73+
config.setAllowCredentials(true);
74+
75+
// setAllowedOrigins 대신 setAllowedOriginPatterns 사용
76+
config.setAllowedOrigins(List.of("http://localhost:5173/"));
77+
78+
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
79+
config.setAllowedHeaders(List.of("Authorization", "Content-Type"));
80+
source.registerCorsConfiguration("/**", config);
81+
return source;
82+
}
83+
}

0 commit comments

Comments
 (0)