Spring
๐ฑ ์์ธ AuthenticationException ์ธ์ฆ ์์ธ ์ฒ๋ฆฌ AuthenticationEntryPoint ํธ์ถ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋, 401 ์ค๋ฅ ์ฝ๋ ์ ๋ฌ ๋ฑ ์ธ์ฆ ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์์ฒญ ์ ๋ณด๋ฅผ ์ ์ฅ RequestCache : ์ฌ์ฉ์ ์ด์ ์์ฒญ ์ ๋ณด๋ฅผ ์ธ์
์ ์ ์ฅํ๊ณ ์ด๋ฅผ ๊บผ๋ด์ค๋ ์บ์ ๋ฉ์ปค๋์ฆ SavedRequest : ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ request ํ๋ผ๋ฏธํฐ ๊ฐ๋ค, ๊ทธ ๋น์ ํค๋ ๊ฐ๋ค ๋ฑ์ด ์ ์ฅ AccessDeniedExeption ์ธ๊ฐ ์์ธ ์ฒ๋ฆฌ AccessDeniedHandler์์ ์์ธ ์ฒ๋ฆฌํ๋๋ก ์ ๊ณต ๐ ์ด๋ฐ ์์ธ๋ FilterSecurityInterceptor์์ ์ฒ๋ฆฌํ๊ณ ์ด ํํฐ ์์ ์๋ ํํฐ๊ฐ ExceptionTranslationFilter์ ๊ทธ๋์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด Filte..
Spring
๊ถํ ์ค์ ๋ฐฉ์์๋ ์ ์ธ์ ๋ฐฉ์๊ณผ ๋์ ๋ฐฉ์์ด ์กด์ฌํ๋ค. ์ ์ธ์ ๋ฐฉ์ URL http.antMatcher("/user/**).hasRole("USER") Method @PreAuthorize("hasRole('USER')") public void user() {System.out.println("user")} ๋์ ๋ฐฉ์ - DB ์ฐ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ URL Method SecurityConfig @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher(“/shop/**”) .authorizeRequests() .antMatchers(“/shop/login”, “/shop/users/**”).permit..
Spring
๐ ๋์ ์ธ์
์ ์ด ๋์ ์ธ์
์ ์ด๋ ํ์ฌ ๋์ผํ ๊ณ์ ์ผ๋ก ์ธ์ฆ์ ๋ฐ์ ๋ ์์ฑ๋๋ ์ธ์
์ ํ์ฉ ๊ฐ์๊ฐ ์ด๊ณผ๋์์ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ๊ทธ ์ธ์
์ ๊ณ์์ ์ผ๋ก ์ด๊ณผํ์ง ์๊ณ ์ธ์
์ ์ ์งํ๋์ง์ ๋ํ ์ ์ด๋ฅผ ๋งํ๋ค. ํ์ฉ ๋ธ๋ผ์ฐ์ ๊ฐ์๊ฐ 1๊ฐ๋ผ๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ์ (์ฌ์ฉ์ 1, 2๋ ๋์ผํ ๊ณ์ ) 1.์ด์ ์ฌ์ฉ์ ์ธ์
๋ง๋ฃํ๋ ๋ฐฉ๋ฒ 2. ํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ์คํจ ๋์ ์ธ์
์ ์ด API maximumSessions : ์ค์ ํ ์๋งํผ ์ต๋ ํ์ฉ ๊ฐ๋ฅ ์ธ์
์๋ฅผ ์ค์ maxSessionPreventsLogin : true๋ก ์ค์ ํ๋ฉด ๋์ ๋ก๊ทธ์ธ ์ฐจ๋จํจ -> ์์์ 2๋ฒ์งธ ๋ฐฉ๋ฒ, false๋ 1๋ฒ์งธ ๋ฐฉ๋ฒ invalidSessionUrl expireUrl ๐ ๋ฐ์ ๋ ๊ฐ ๋ค ์ค์ ํ๋ฉด invalidSessionUrl์ด ์ฐ์ ์์๊ฐ ..
Spring
isAnonymous() : ๋ก๊ทธ์ธํ ๋ ์ฌ์ฉ isAuthenticated() : ๋ก๊ทธ์์ํ ๋ ์ฌ์ฉ ์คํ๋ง์์ ์ฌ๊ณตํ๋ AnonymousAuthenticaitonFilter๋ฅผ ๋ณด๋ฉด @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { if (SecurityContextHolder.getContext().getAuthentication() == null) { Authentication authentication = createAuthentication((HttpServletRequest) req); SecurityContext ..
Spring
๐ Remember-Me ์ธ์
์ด ๋ง๋ฃ๋๊ณ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ข
๋ฃ๋ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์๋ฅผ ๊ธฐ์ตํ๋ ๊ธฐ๋ฅ์ด๋ค. โ Remember-Me ์ฟ ํค์ ๋ํ http์์ฒญ์ ํ์ธํ ํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํด ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ํ ํฐ์ด ๊ฒ์ฆ๋๋ฉด ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ๋๋ค. ์ฌ์ฉ์ ๋ผ์ดํ ์ฌ์ดํด ์ธ์ฆ ์ฑ๊ณต (Remember-Me ์ฟ ํค ์ค์ ) ์ธ์ฆ ์คํจ (์ฟ ํค๊ฐ ์กด์ฌํ๋ฉด ์ฟ ํค ๋ฌดํจํ) ๋ก๊ทธ์์ (์ฟ ํค๊ฐ ์กด์ฌํ๋ฉด ์ฟ ํค ๋ฌดํจํ) rememberMeParameter : ๋ฒํผ ์ด๋ฆ์ด๋ ๋๊ฐ์ด ํด์ผ ๋จ alwaysRemember(true) : ๋ก๊ทธ์ธํ ๋ ๋ฆฌ๋ฉค๋ฒ ๋ฏธ ์ฌ์ฉ ์ ํด๋ ํ์ฑํ๋์ด์์ userDetailsService๋ ํ์ ํด๋น ์ค์ ์ ํ๊ณ ๋์ ์๋ฒ๋ฅผ ์คํ์์ผ ๋ณด๋ฉด ์๋์ฒ๋ผ Remember me on this comput..
Spring
๐ฑ ์ ์ฒด์ ์ธ ๋ก๊ทธ์์ ๋ก์ง ์ํ๋ฆฌํฐ๋ฅผ ํตํด ๋ก๊ทธ์์์ ํ๊ฒ ๋๋ฉด ์ธ์
๋ฌดํจํ ์ธ์ฆ ํ ํฐ ์ญ์ ์ญ์ ํ ์ฟ ํค ์ ๋ณด๊ฐ ์๋ค๋ฉด ์ญ์ ๋ก๊ทธ์ธ ํ์ด์ง ๋ฆฌ๋ค์ด๋ ํธ ํด๋น ์์
์ ์ํํ๊ฒ ๋๋ค. ๋ก๊ทธ์์ API logout : ๋ก๊ทธ์์ ๊ธฐ๋ฅ ํ์ฑํ logoutUrl : ๋ก๊ทธ์์ url ์ ๋ณด ์ ๋ฌ (form ํ๊ทธ์์ url ๋ณ๊ฒฝ ๊ฐ๋ฅ) logoutSuccessUrl : ๋ก๊ทธ์์ ์ฑ๊ณตํ ๋ ์ด๋ํ url deleteCookies : ์ฟ ํค๋ฅผ ๋ฐ๊ธํ์ ๊ฒฝ์ฐ์ ์ญ์ ๊ฐ ํ์ํ๋ฐ ์ฟ ํค๋ฅผ ์ญ์ ํจ remember-me ๊ฐ์ ๊ฒฝ์ฐ๋ ๋์ค์ ๋ก๊ทธ์ธํ ๋ remember-me ์ธ์ฆ์ด ์๋๋ฐ ์๋ฒ์์ ๋ง๋ ์ฟ ํค๋ฅผ ์ญ์ ํ๋ ๊ฒ logoutSuccessHandler : ๋ก๊ทธ์์์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๊ณ ํ์ ์์
์ ํ๋ ํธ๋ค๋ฌ ๋ก๊ทธ์์ filter ..
Spring
๐ฑ ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ก๊ทธ์ธ ๋ก์ง form์ ํตํด์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด ์ธ์
๋ฐ ์ธ์ฆ ํ ํฐ์ ์ ์ฅํ๋ค. ์ถํ์๋ ํด๋น ์ธ์ฆ์ ํตํด์ ์์
๊ฐ๋ฅํ๋ค. ๋ก๊ทธ์ธ API ์ฌ๊ธฐ์ ๋ง๋ถ์ฌ์ ์ค๋ช
ํ๋ฉด loginProcessingUrl : form ํ๊ทธ์ ์๋ action url , ํ์๋ฆฌํ ์ฐ๋ฉด th:action successHandler : ์ฑ๊ณตํ์ ๋ ๋ด๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ํธ๋ค๋ฌ failureHandler : ์คํจํ์ ๋ ๋ด๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ํธ๋ค๋ฌ ๐ successUrl์ด๋ failureUrl์ด๋ ๋น์ทํ๋ค๋ ์๊ฐ์ ํ ์๋ ์๊ฒ ์ง๋ง ์์ ๋ ๊ฐ๋ url์ค์ ๋ฐ์ ํ์ง ๋ชปํ๋ค. Controller @GetMapping("/loginPage") public Strin..
Spring
๊ฐ์๋ค์ผ๋ฉด์ ๋ฐฐ์ด ๊ฒ๋ค์ ๊ฐ๋จํ๊ฒ๋ผ๋ ๋จ๊ฒจ๋ณด๋ ค๊ณ ํ๋ค! ๐ฅ Spring Security(์คํ๋ง ์ํ๋ฆฌํฐ)๋? Spring ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ณด์์ ๋ด๋นํ๋ Spring ํ์ ํ๋ ์์ํฌ์ด๋ค. springboot์ spring security๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋ ์์กด์ฑ์ ์ถ๊ฐํด์ค์ผํ๋ค. implementation 'org.springframework.boot:spring-boot-starter-security' ์คํ๋ง ์ํ๋ฆฌํฐ์ ์์กด์ฑ์ ์ถ๊ฐํ๋ฉด ์ผ์ด๋๋ ๊ฒ์? ์๋ฒ๊ฐ ๊ฐ๋๋๋ฉด ์คํ๋ง ์ํ๋ฆฌํฐ์ ์ด๊ธฐํ ์์
๋ฐ ๋ณด์ ์ค์ ์ด ์ด๋ฃจ์ด์ง ๋ณ๋์ ์ค์ ์ด๋ ๊ตฌํ์ ํ์ง ์์๋ ๊ธฐ๋ณธ์ ์ธ ์น ๋ณด์ ๊ธฐ๋ฅ์ด ํ์ฌ ์์คํ
์ ์ฐ๋๋ผ ์๋ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ์ด ๋์ด์ผ ์์์ ์ ๊ทผ์ด ๊ฐ๋ฅ ์ธ์ฆ ๋ฐฉ์์ Form ๋ก๊ทธ์ธ ๋ฐฉ์๊ณผ ..
Spring
์ฝ๋๋ฅผ ์์ฑํ๋ค๊ฐ repository.save()๋ฅผ ํ์ง ์์๋ update ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ด DB์ ๋ฐ์๋๋ ํ์์ ๋ณด๊ณ Dirty Checking์ ๋ํด์ ์์๋ณด์๋ค ๐ค โ๏ธ Dirty Checking์ด๋? Spring JPA์์ ๋ํฐ ์ฒดํน์ด๋ ์์์ฑ ์ปจํ
์ด๋๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ์ ์ํ๋ฅผ ๊ฐ์งํด์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋์ผ๋ก ํธ๋์ญ์
์ด ๋๋๋ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ ๊ธฐ๋ฅ์ด๋ค. dirty : ๋ณ๊ฒฝ๋ ์ํฐํฐ ๋ฐ์ดํฐ dirty checking : ๋ณ๊ฒฝ๋ ๋ถ๋ถ ๊ฐ์ง Dirty Checking์ ์ธ์ ์ผ์ด๋ ๊น? ์์์ฑ ์ปจํ
์คํธ์์ ๊ด๋ฆฌ๋๋ ์ํฐํฐ ์ค์์/๋น์์ ์ํ์ ์ํฐํฐ๋ ๋ํฐ ์ฒดํน์ ๋์์ด ๋์ง ์๋๋ค. Transaction(ํธ๋์ญ์
)์ด ์ปค๋ฐ๋์์ ๋ ํธ๋์ญ์
์ด ์ปค๋ฐ๋๊ธฐ ์ ๊น์ง ์์์ฑ ์ปจํ
์คํธ๋ ๋ณ..
Spring
Service์ ServiceImpl์ ๋ถ๋ฆฌํด์ ์ฌ์ฉํด ๋ณธ ์ ์ด ์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ด์ ํ ๋ฒ ์กฐ์ฌํด ๋ดค๋คโ๏ธ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋ก ๋๋ ๊ฑด OCP(๊ฐ๋ฐฉ-ํ์ ์์น) ๋๋ฌธ์ด๋ค. ๐ธ OCP๋? ์ํํธ์จ์ด ๊ฐ์ฑ๋ ํ์ฅ์ ๋ํด ์ด๋ ค์์ด์ผ ํ๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ํ๋ก๊ทธ๋๋ฐ ์์น์ด๋ค. ์ด ์์น์ด ์ ์ ์ฉ๋๋ฉด, ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒจํด์ผ ํ ๋ ์ด๋ฏธ ์ ๋๋ก ๋์ํ๊ณ ์๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๊ธฐ์กด์ ์ฝ๋์ ์๋ก์ด ์ฝ๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ๐ธ Service์ ServiceImpl sevice๋ฅผ ๋จผ์ ์ ์ํ๊ณ , serviceimpl์ด service ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์ ๊ตฌํํ๋ ๊ฒ์ด๋ค. Controller์์๋ service๋ฅผ ํธ์ถํ๋ค!! ํ๋ก์ ํธ์์๋ ์ ์ฉ..