Skip to content

Commit c3a5d39

Browse files
authored
Merge pull request #62 from CommitField/feat/#5
feat: ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ํ”„๋ก ํŠธ ์—ฐ๋™
2 parents c0bc119 + 0038098 commit c3a5d39

File tree

4 files changed

+68
-65
lines changed

4 files changed

+68
-65
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: 40 additions & 46 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,9 +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.security.web.util.matcher.AntPathRequestMatcher;
14+
import org.springframework.web.cors.CorsConfiguration;
15+
import org.springframework.web.cors.CorsConfigurationSource;
16+
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
1517

16-
import static org.springframework.security.config.Customizer.withDefaults;
18+
import java.util.List;
1719

1820
@Configuration
1921
@EnableWebSecurity
@@ -26,64 +28,56 @@ public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
2628

2729
@Bean
2830
protected SecurityFilterChain config(HttpSecurity http) throws Exception {
29-
// ๊ถŒํ•œ ์„ค์ •
30-
http
31-
.cors(withDefaults()) // CORS ์„ค์ • ํ™œ์„ฑํ™”
32-
.csrf(csrf -> csrf.disable())
33-
.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
34-
.requestMatchers(new AntPathRequestMatcher("/**")).permitAll())
35-
;
36-
37-
//๋กœ๊ทธ์ธ ๊ด€๋ จ ์„ค์ •
3831
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+
)
3940
.oauth2Login(oauth2 -> oauth2
4041
.loginPage("/login") // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ง€์ •
4142
.successHandler((request, response, authentication) -> {
42-
// ์ธ์ฆ ์ •๋ณด๊ฐ€ SecurityContext์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ
4343
SecurityContextHolder.getContext().setAuthentication(authentication);
4444

45-
CustomOAuth2User customUser = (CustomOAuth2User) authentication.getPrincipal();
46-
47-
// ๋””๋ฒ„๊น…: authentication ์ •๋ณด ํ™•์ธ
48-
System.out.println("Authentication: " + authentication);
49-
System.out.println("Principal: " + authentication.getPrincipal());
50-
51-
if (authentication != null && authentication.getPrincipal() != null) {
52-
//์ธ๊ฐ€๊ฐ€ ์žˆ์œผ๋ฉด ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅ
53-
OAuth2User principal = (OAuth2User) authentication.getPrincipal();
54-
String username = principal.getAttribute("login");
45+
OAuth2User principal = (OAuth2User) authentication.getPrincipal();
46+
String username = principal.getAttribute("login");
5547

56-
// ์„ธ์…˜์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”๊ฐ€
57-
request.getSession().setAttribute("user", username);
48+
// ๋””๋ฒ„๊น… ๋กœ๊ทธ
49+
System.out.println("OAuth2 ๋กœ๊ทธ์ธ ์„ฑ๊ณต: " + username);
5850

59-
response.sendRedirect("/"); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
60-
} else {
61-
// ์ธ์ฆ ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ
62-
response.sendRedirect("/login?error=authenticationFailed");
63-
}
51+
response.sendRedirect("http://localhost:5173/home"); // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
6452
})
6553
)
66-
.sessionManagement(session -> session
67-
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // ์„ธ์…˜ ์ •์ฑ… ์„ค์ •
68-
.invalidSessionUrl("/login?error=invalidSession") // ์„ธ์…˜์ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋™ํ•  URL
69-
.maximumSessions(1) // ํ•˜๋‚˜์˜ ๊ณ„์ •์œผ๋กœ ํ•œ ๋ฒˆ์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ
70-
.expiredUrl("/login?error=sessionExpired") // ์„ธ์…˜ ๋งŒ๋ฃŒ ํ›„ ์ด๋™ํ•  URL ์„ค์ •
71-
);
72-
73-
//๋กœ๊ทธ์•„์›ƒ ๊ด€๋ จ ์„ค์ •
74-
http
7554
.logout(logout -> logout
76-
.logoutUrl("/logout") // ๋กœ๊ทธ์•„์›ƒ URL ์„ค์ •
77-
.logoutSuccessUrl("/") // ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต ํ›„ ์ด๋™ํ•  URL
55+
.logoutUrl("api/logout") // ๋กœ๊ทธ์•„์›ƒ URL ์„ค์ •
7856
.invalidateHttpSession(true) // ๋กœ๊ทธ์•„์›ƒ ์‹œ ์„ธ์…˜ ๋ฌดํšจํ™”
7957
.clearAuthentication(true) // ์ธ์ฆ ์ •๋ณด ์ง€์šฐ๊ธฐ
8058
.deleteCookies("JSESSIONID") // ์„ธ์…˜ ์ฟ ํ‚ค ์‚ญ์ œ
81-
);
82-
http
83-
.csrf(
84-
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+
})
8564
);
8665

8766
return http.build();
8867
}
89-
}
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)