๊ฒฝํ
์ด๋ฒ ํ๊ธฐ์๋ ICT ์ธํด์ ์งํํ๊ณ ์๋๋ฐ ICT ์ธํด๋ค์ ๋์์ผ๋ก ์ง๋ฌด ํน๊ฐ์ ์ฐ๋ค๊ณ ํด์ ๋ค๋
์๋ค! ์ค์ ์ ์ถ๊ทผํ๋ค๊ฐ ๊ฐ๋จ์ผ๋ก ๋์ด๊ฐ๋๋ ์คํ ๋ฐ์ฐจ๋ฅผ ์ด ๊ธฐ๋ถ์ด์๋ค ใ
ใ
ใ
์ญ์ ์ ๋ถ์์ ์ง์ํ๋๊ฑฐ๋ผ ๊ทธ๋ฐ์ง ์ปคํผ, ๋ฌผ, ๊ณผ์ผ, ๊ณผ์, ์ ค๋ฆฌ... ๊ฐ์์ด ์์ฃผ ๋์ณ๋ฌ๋ค ๐ท๐ท ์์๋ ๋ค์ด๋ฒ-์นด์นด์ค-๋ผ์ธํ๋ฌ์ค ๊ฐ๋ฐ์ ๋ถ ์์๋ก ๊ฐ์ฐ์ด ์ด๋ฃจ์ด์ก๋ค ๋๋ ๋์ธ๋ฒ์งธ ๊ฐ์ฐ์ ๋ฐฑ์๋-์๋ฒ(๋ฐ์ดํฐ)๋ก ์ ํํด์ ๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ก ํธ๋ ์ธ๊ณต์ง๋ฅ ๋ค์ผ์ ๋ถ๋ค์ ๋ค๋ฅธ ๊ฐ์๋ฅผ ๋ค์์ ์๋! ํน๊ฐ ๋ค์ ๋ด์ฉ์ ํ ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ๊ธ์ ์ด๋ค !! ์ฌ์ค ๋ฐฑ์๋๋ ์๋ฒ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ด๊ฐ ์ข ๋ ๊ณต๋ถ๋ฅผ ํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ์ด์ ์ข์ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผ๋ ์ง ์ ์ด๋ณด๋ ค๊ณ ํ๋ค ใ
ใ
๐ป ์ข์ ๊ฐ๋ฐ์๊ฐ ๋๋ ๋ฐฉ๋ฒ - ์ฐ์ํ๋ (๋ค์ด๋ฒ)..
Spring
Form ์ธ์ฆ - PasswordEncoder ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ํธํํ๋๋ก ์ ๊ณต ์์ฑ PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder() ์ฌ๋ฌ ๊ฐ์ PasswordEncoder ์ ํ์ ์ ์ธํ ๋ค, ์ํฉ์ ๋ง๊ฒ ์ ํํด์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ Encoder์ด๋ค. ์ํธํ ํฌ๋งท {id}encodedPassword ๊ธฐ๋ณธ ํฌ๋งท์ Bcrypt : {bcrypt}$2a@10~~~ ์๊ณ ๋ฆฌ์ฆ ์ข
๋ฅ : bcrypt, noop, pbkdf2, scrypt, sha256 PasswordEncoder๋ฅผ ์ด์ฉํด ๋น๋ฐ๋ฒํธ ์ํธํ๋ฅผ ํ ๋ค ์ฌ์ฉ์๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด! ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค. (ํ์ง๋ง ์๋๋ ๊ฐ์๋ฅผ..
Spring
๊ณต๊ฒฉ์ ์ํ์ฑ ํด๋น ๋ก์ง์ ํตํด์ ํด์ปค๋ค์ด ๊ณต๊ฒฉ์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ผํ๋ชฐ์ ๋ก๊ทธ์ธํ๊ณ ๋์ ์ฟ ํค๋ฅผ ๋ฐ๊ธํ๋ฉด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๊ฐ ์ ์ฅ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ๋งํฌ๋ฅผ ์ด์ฉ์์๊ฒ ์ ๋ฌํ๊ณ ์ฌ์ฉ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด์ ๊ณต๊ฒฉ์ฉ ์นํ์ด์ง์ ์ ์ํ๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ๊ณต๊ฒฉ์ฉ url์ ์ด๊ณ ์ผํ๋ชฐ์ ํด๋น ์ฟ ํค๋ฅผ ๊ฐ์ง ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ฌํ์ง ์๊ณ ์ธ์ฆ์ ํ๋ค. ์ํ๋ฆฌํฐ๋ ์ด๋ฐ ๊ณต๊ฒฉ ๋ฐฉ์์ ๋ฐฉ์ดํ๊ธฐ ์ํด์ CsrfFilter๋ฅผ ๋ง๋ค์ด์ csrf์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ณ ์๋ค. CsrfFilter ๋ชจ๋ ์์ฒญ์ ๋๋ค ํ๊ฒ ์์ฑ๋ ํ ํฐ์ HTTP ํ๋ผ๋ฏธํฐ๋ก ์๊ตฌ ์์ฒญ ์ ์ ๋ฌ๋๋ ํ ํฐ ๊ฐ๊ณผ ์๋ฒ์ ์ ์ฅ๋ ์ค์ ๊ฐ๊ณผ ๋น๊ตํ ํ ๋ง์ฝ ์ผ์นํ์ง ์์ผ๋ฉด ์์ฒญ์ ์คํจํจ HTTP ๋ฉ์๋ : PATCH, POST, PUT, DE..
Spring
๐ฑ ์์ธ AuthenticationException ์ธ์ฆ ์์ธ ์ฒ๋ฆฌ AuthenticationEntryPoint ํธ์ถ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋, 401 ์ค๋ฅ ์ฝ๋ ์ ๋ฌ ๋ฑ ์ธ์ฆ ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์์ฒญ ์ ๋ณด๋ฅผ ์ ์ฅ RequestCache : ์ฌ์ฉ์ ์ด์ ์์ฒญ ์ ๋ณด๋ฅผ ์ธ์
์ ์ ์ฅํ๊ณ ์ด๋ฅผ ๊บผ๋ด์ค๋ ์บ์ ๋ฉ์ปค๋์ฆ SavedRequest : ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ request ํ๋ผ๋ฏธํฐ ๊ฐ๋ค, ๊ทธ ๋น์ ํค๋ ๊ฐ๋ค ๋ฑ์ด ์ ์ฅ AccessDeniedExeption ์ธ๊ฐ ์์ธ ์ฒ๋ฆฌ AccessDeniedHandler์์ ์์ธ ์ฒ๋ฆฌํ๋๋ก ์ ๊ณต ๐ ์ด๋ฐ ์์ธ๋ FilterSecurityInterceptor์์ ์ฒ๋ฆฌํ๊ณ ์ด ํํฐ ์์ ์๋ ํํฐ๊ฐ ExceptionTranslationFilter์ ๊ทธ๋์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด Filte..
๊ธฐํ
์ปค๋ฐ์ ํ๋ ค๋ค๊ฐ ํด๋น ๋ฌธ๊ตฌ๊ฐ ๋ฐ์ํ๋ฉด์ ์ปค๋ฐ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค ์ด๋ด ๊ฒฝ์ฐ์๋ .git ํ์ผ์ด ์กด์ฌํ๋ ํด๋์์ git bash๋ฅผ ์คํํ ๋ค์์ ์๋ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋๋ค. rm -f ./.git/index.lock
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 ..