๐๐ป Spring Security
- Spring Framework ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ฆ๊ณผ ์ธ๊ฐ ๊ธฐ๋ฅ์ ๊ฐ์ง ํ๋ ์์ํฌ
- ์คํ๋ง ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณด์์ ์ํ ํ์ค
โ ๋ชจ๋ ์์ฒญ์ ๋ํด์ ์ธ์ฆ์ ์๊ตฌํจ
โก ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ์ํธ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆํ ์ ์๋๋ก ํ์ฉ
โข ์ฌ์ฉ์์ ๋ก๊ทธ์์์ ํ์ฉ
โฃ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์ง
โข ์ธ์ ๊ณ ์ ๊ณต๊ฒฉ : Session Fixsation์ ๋ณดํธ
- Session Fixsation? ๊ณต๊ฒฉ์๊ฐ ์์ ์ ์ธ์ id๋ฅผ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ค์ผ๋ก์จ ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ
โฅ ๋ณด์ ํค๋ ํตํฉ
- HSTS ๊ฐํ
- X-Content-TypeOptions
- ์บ์ ์ปจํธ๋กค๋ฌ : ์ ์ ๋ฆฌ์์ค ์บ์ฑ
- X-XSS-Protection XSS ๋ณด์ (์คํฌ๋ฉํธ ๊ณต๊ฒฉ ๋ณด์)
- ํด๋ฆญ์ฌํน์ ๋ฐฉ์งํ๋ X-Frame ์ต์ ํตํฉ
→ ํด๋ฆญ ์ฌํน?
- ์น ์ฌ์ฉ์๊ฐ ์์ ์ด ํด๋ฆญํ๊ณ ์๋ค๊ณ ์ธ์งํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์ด๋ค ๊ฒ์ ํด๋ฆญํ๊ฒ ์์ด๋ ์ ์์ ์ธ ๊ธฐ๋ฒ
- ๊ณต๊ฒฉ์๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ ์ถ์ํค๊ฑฐ๋ ๊ทธ๋ค์ ์ปดํจํฐ์ ๋ํ ์ ์ด๋ฅผ ํ๋ํ ์ ์๊ฒ ๋จ
โฆ Servlet API ์ ๊ณต
๐ก์ฃผ์ฒด Principal
- ์ ์ , ๊ธฐ๊ธฐ, ์์คํ ๋ฑ์ด ๋ ์ ์์ง๋ง ๋ณดํต ์ ์ , ์ฌ์ฉ์๋ฅผ ์๋ฏธ
๐ก์ธ์ฆ : Authentication
- ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค๊ณ ํ๋ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ ๋ ์ฌ์ฉ
- ์ฃผ์ฒด์ ์ ์์ ์ฆ๋ช ํ๋ ๊ณผ์
- ์ฃผ์ฒด๋ ์์ ์ ์ธ์ฆํด๋ฌ๋ผ๊ณ ์ ์ ์ฆ๋ช ์ ๋ณด ์ ์
- ์ฃผ์ฒด๊ฐ ์ ์ ์ผ ๊ฒฝ์ฐ ์ ์ ์ฆ๋ช ์ ๋ณด๋ ํจ์ค์๋
๐ก์ธ๊ฐ = ๊ถํ ๋ถ์ฌ : Authorization
- ์ธ์ฆ์ ๋ง์น ์ ์ ์๊ฒ ๊ถํ์ ๋ถ์ฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ฐํ๋ ๊ณผ์
- ์ธ๊ฐ๋ ๋ฐ๋์ ์ธ์ฆ ๊ณผ์ ์ดํ ์ํ๋์ด์ผ ํ๋ฉฐ ๊ถํ์ ๋กค ํํ๋ก ๋ถ์ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์
๐ก์ ๊ทผ ํต์ : Access Control
- ์ด๋ค ์ ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ก ํ๋ฝํ ์ง ์ ์ดํ๋ ํ์
- ๋ฆฌ์์ค์ ์ ๊ทผ ์์ฑ๊ณผ ์ ์ ์๊ฒ ๋ถ์ฌ๋๊ถํ ๋๋ ๋ค๋ฅธ ์์ฑ๋ค์ ๊ฒฐ์
๐HttpSecurity ๊ฐ์ฒด
- ๋ช ๊ฐ์ง HTTP ๋ณด์ ๊ด์ ์ ์ค์ ํ๊ธฐ ์ํด ์ฌ์ฉ
โธ authorizeRequests( )
- ์ด ํธ์ถ๋ก ๋ฐํ๋๋ ๊ฐ์ฒด๋ก ํธ์ถ๋๋ ๋ฉ์๋๋ค์ ์์ฒญ ๋ณด์ ์์ค ์ธ๋ถ์ ์ธ ์ค์
โธ antMatchers("๊ฒฝ๋ก").authenticated( )
- ์ง์ ๋ ๊ฒฝ๋ก๋ก ํธ์ถ๋ ์์ฒญ์ ์ธ์ฆ์ด ๋์ด์ผ ํจ์ ์๋ฏธ
- antMatchers๋ ๊ถํ ๊ด๋ฆฌ ๋์์ ์ง์ ํจ
โธ antMatchers("๊ฒฝ๋ก").access(String)
- ์ฃผ์ด์ง SpEL ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ๊ฐ true ์ด๋ฉด ์ ๊ทผ ํ์ฉ
- SpEL์ access( )๋ฅผ ์ฌ์ฉํ ๋ ์ ๊ทผ ์๊ตฌ ์ฌํญ์ ์ ์ธํ๊ธฐ ์ํ ์๋จ์ผ๋ก ์ฌ์ฉ
- hasRole()์ ์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ง์๋๋ ๋ณด์ ํน์ฑ ํํ
โธ anyRequest( ).permitAll( )
- ์ง์ ํ ์์ฒญ๋ค์ ์ ์ธํ ๋ค๋ฅธ ์์ฒญ๋ค์ ์ธ์ฆ์ด๋ ๊ถํ ์์ด ํ์ฉ
โช๏ธ http.csrf( ).disable( )
- ์๋ฒ์ ์ธ์ฆ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ถํ์ํ csrf ์ฝ๋๋ค์ ์์ฑํ์ง ์์
โช๏ธ http.headers( ).frameOptions( ).disable( )
- h2 Consle ํ๋ฉด์ ์ฌ์ฉํ๊ธฐ ์ํด Frame ์ต์ ์ disable ํจ
๐ WebMvcConfigurer์ ์์ํ๋ ์ด์
- @EnableWebMvc๊ฐ ์๋์ ์ผ๋ก ์ธํ ํด์ฃผ๋ ์ค์ ์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์ค์ ์ถ๊ฐ ๊ฐ๋ฅ
โธ @EnableWebMvc
- Spring MVC ๋ฅผ ๊ตฌ์ฑํ ๋ ํ์ํ Bean ์ค์ ๋ค์ ์๋์ผ๋ก ํด์ฃผ๋ ์ด๋ ธํ ์ด์
๐ PasswordEncoder ์ธํฐํ์ด์ค
- encode( )๋ ์ค์ ๋ก ํจ์ค์๋ ์ํธํํ ๋ ์ฌ์ฉ
- matchers( )๋ ์ฌ์ฉ์์๊ฒ ์ ๋ ฅ๋ฐ์ ํจ์ค์๋๋ฅผ ๋น๊ตํ๊ณ ์ ํ ๋ ์ฌ์ฉ
โช๏ธ BCryptPasswordEncoding
- ์คํ๋ง ์ํ๋ฆฌํฐ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํด๋์ค ์ค ํ๋๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ํด๋์ค
- BCrypt ํด์ฑ ํจ์๋ฅผ ์ฌ์ฉํด์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ธ์ฝ๋ฉํด์ฃผ๋ ๋ฉ์๋์
์ฌ์ฉ์์ ์ํด ์ ์ถ๋ ๋น๋ฐ๋ฒํธ์ ์ ์ฅ์์ ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ์ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณต
- ๋จ์ํ ํด์๋ฅผ ํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ Salt๋ฅผ ๋ฃ๋ ์์ ๊น์ง ํ๋ฏ๋ก
์ ๋ ฅ ๊ฐ์ด ๊ฐ์์๋ ๋ถ๊ตฌํ๊ณ ๋งค๋ฒ ๋ค๋ฅธ encoded ๋ ๊ฐ์ return ํด์ค
- encode( ) ๋ฉ์๋ : ํจ์ค์๋๋ฅผ ์ํธํํด์ฃผ๋ ๋ฉ์๋
โช๏ธ DelegatingPasswordEncoding
- PassWordEncoder์ ์ฌ๋ฌ ๊ฐ ์ ์ธํ ๋ค ์ํฉ์ ๋ง๊ฒ ๊ณจ๋ผ์ธ ์ ์๋๋ก ์ง์ํ๋ Encoder
String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCyptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCyptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());
PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
- ์์ ๊ฐ์ด ์ ์ธํ๋ฉด bcrypt, noop, pbkdf2, scrypt, sha256์ด encoders ์์ ๋ค์ด๊ฐ๊ฒ ๋จ
- ๋ง์ง๋ง์ ์ ์ธํ์ ๋ idForEncode๋ฅผ bcypt๋ก ์ฃผ์์ผ๋ ์ต์ข ์ผ๋ก encoding ๋๋ ๊ฐ์
bcypt๋ก ํด์ฑ ๋ ํจ์ค์๋๊ฐ ๋ฆฌํด ๋๋ฉฐ ๋งจ ์์ prefix๋ก ์ํธํํ ๋ฐฉ๋ฒ์ด ๋ถ์
* ์ฅ์ *
- ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ฌ ๊ถ์ฅํ๋ ์ ์ฅ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํจ์ ๋ณด์ฅํจ
- ๋น๋ฐ๋ฒํธ ๊ฒ์ฆ์ ์ต์ ํ์๊ณผ ๋ ๊ฑฐ์ ํ์์ ๋ชจ๋ ์ง์
- ๋์ค์ ์ธ์ฝ๋ฉ ๋ณ๊ฒฝ ๊ฐ๋ฅ
โช๏ธ SCryptPasswordEncoder
- Scrypt ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ฐ์ ์ผ๋ก cpu์ memory์ cost ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ์ ์์
- Scrypt๋ ์ค์ ๋ก Salsa20์ด๋ผ๋ ํด์ฑ ๋ฐฉ์ ์ฌ์ฉ
๐๐ป Filter์ FilterChain
๐ Filter Interface
- FIlter ? HTTP ์์ฒญ๊ณผ ์๋ต์ ๋ณ๊ฒฝํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋
- ํํฐ๋ฅผ ์ค์ ํ๋ FilterConfig ๊ฐ์ฒด, FilterChain ๊ฐ์ฒด, Filter ๊ฐ์ฒด ํ์
- FilterConfig์ FilterChain์ ์์๋ฐ์ ํด๋์ค๋ค์ ์น์ปจํ ์ด๋๊ฐ ๊ตฌํํด์ค
- Filter ์ธํฐํ์ด์ค๋ init(), doFilter(), destory() ๋ฉ์๋ ํ์
public class FirstFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
//ํํฐ์ ์ด๊ธฐํ ์์
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
//request ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ ์์ฒญ์ ํํฐ ์์
์ํ
//์ฒด์ธ์ ๋ค์ ํํฐ ์ฒ๋ฆฌ
chain.doFilter(request, response);
//response๋ฅผ ์ด์ฉํ์ฌ ์๋ต์ ํํฐ๋ง ์์
์ํ
}
public void destory() {
//์ฃผ๋ก ํํฐ๊ฐ ์ฌ์ฉํ ์์์ ๋ฐ๋ฉ
}
}
โ init(FilterConfig config)
- ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํํฐ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด์ ํธ์ถํ๋ ๋ฉ์๋
โก doFilter(ServletRequest resquest ServletResponse response, FilterChain chain)
- ํํฐ์์ ๊ตฌํํด์ผ ํ๋ ๋ก์ง์ ์์ฑํ๋ ๋ฉ์๋
โข destory() : void
- ํํฐ ์ธ์คํด์ค๋ฅผ ์ข ๋ฃ์ํค๊ธฐ ์ ์ ํธ์ถํ๋ ๋ฉ์๋
๐ FilterChain
- ์ฌ๋ฌ ๊ฐ์ ํํฐ๋ค์ด ์ฌ์ฌ์ฒ๋ผ ์ฐ๊ฒฐ๋์ด ์๊ณ ์๋ก ์ฐ๊ฒฐ๋์ด ๋์
- ํด๋ผ์ด์ธํธ๊ฐ ์ฑ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์ปจํ ์ด๋๋ ์์ฒญ URI์ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค ํํฐ์ ์๋ธ๋ฆฟ์ ์ ์ฉํ ์ง ๊ฒฐ์
- ํ๋์ ์๋ธ๋ฆฟ์ ๋จ์ผ ์์ฒญ ์ฒ๋ฆฌ
- ํํฐ๋ ์ฒด์ธ์ ํ์ฑํ์ฌ ์์๋ฅผ ์ง์ ํ๋ฉฐ ์ค์ ๋ก ์์ฒญ ์์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ํํฐ๊ฐ ๋๋จธ์ง ์ฒด์ธ ๊ฑฐ๋ถ ๊ฐ๋ฅ
- ํํฐ๋ ํํฐ์ฒด์ธ์ ํตํด ์ฌ๋ฌ ํํฐ๊ฐ ์ฐ์์ ์ผ๋ก ๋์ํ๊ฒ ํ ์ ์์
- 1๊ฐ์ ์๋ธ๋ฆฟ์ด HttpServletRequest์ HttpServletResponse ์ฒ๋ฆฌ ๋ด๋น
โช๏ธ Filter Chain ์์
โ @Order or Ordered ๊ตฌํ
- Filter ํ์ ์ @Beans์ @Order๋ฅผ ๋ถ์ด๊ฑฐ๋ Orderd๋ฃฐ ๊ตฌํํจ
โก FilterRegistrationBean
- API์ ์ผ๋ถ๋ก ์์๋ฅผ ๊ฐ์ง๋ FilterRegistrationBean์ ์ผ๋ถ๊ฐ ๋จ
๐ก ์๋ธ๋ฆฟ : Servlet
- ๋์ ์น ํ์ด์ง๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ๋๋ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์
= ์น ์๋ฒ๋ก ์น ํ์ด์ง๋ฅผ ์ ๊ณตํ ๋ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋์์ค
- ์น ์์ฒญ๊ณผ ์๋ต์ ํ๋ฆ์ ๊ฐ๋จํ ๋ฉ์๋ ํธ์ถ๋ง์ผ๋ก ์ฒด๊ณ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์์ ์ ๋ ฅ๋๋ ์์ด๋์ ๋น๋ฒ์ ํ์ธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋ตํด์ฃผ๋ ์ญํ ์ํ
๐ก ์๋ธ๋ฆฟ ํํฐ : Servlet Filter
- ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ์ , ํ๋ก ๊ณตํต ๋ก์ง์ ์ํํ๋ ์ญํ
- ๊ณตํต์ ์ธ ๊ธฐ๋ฅ๋ค์ ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ์ ์ ์ํํ๊ฑฐ๋ ํธ์ถ๋ ํ ์ํํ๊ฒ ํ๊ณ ์ถ์ ๋ ์๋ธ๋ฆฟ ํํฐ๋ก ๊ตฌํ
๐ DelegatingFilterProxy
- ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ์ ๊ฐ์ธ๊ฒ ํด์ ๋ชจ๋ ์์ฒญ์ ๋ณด์์ด ์ ์ฉ๋๊ฒ ํ๋ ์๋ธ๋ฆฟ ํํฐ
- DelegatingFilterProxy๋ผ๋ ํํฐ๊ตฌํ์ฒด๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์คํ๋ง ์ปจํ ์ด๋ ์ฐ๊ฒฐ
→ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ Filter ๋ฑ๋ก์ด ๊ฐ๋ฅํ์ง๋ง ์คํ๋ง์ด ์ ์ํ๋ Bean์ ์ธ์ํ์ง๋๋ชปํจ
- ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ Filter๋ฅผ ๊ตฌํํ ์คํ๋ง ๋น์ผ๋ก ์์ํด์ค
- ์๋ธ๋ฆฟ ํํฐ๋ก Spring IOC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ Filter Bean์ ๊ฐ์ง๊ณ ์์
๐ FilterChainProxy
- SecurityFilterChain์ ํตํด ์ฌ๋ฌ Filter ์ธ์คํด์ค๋ก ์์ ๊ฐ๋ฅ
- FilterChainProxys๋ ๋น์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต DelegatingFilterProxy๋ก ๊ฐ์ธ์ ธ ์์
โ FilterChain์์ ์ฌ๋ฌ Filter๋ฅผ ์ ์ฉํ ์ ์์
โก Filter ์คํ ์ค Delegating FilterProxy๊ฐ ์กด์ฌํ ์ ์์
- DelegatingFilterProxy ๋ด๋ถ์ ์๋ Bean Filter๋ FilterChainProxy๊ฐ ๋จ
โข SecurityFilterChain์ FilterChainProxy๋ก ๋ฑ๋ก๋จ
โฃ ์ฌ๋ฌ ๊ฐ์ SecurityFilterChain์ด ์์ ๋ ์ด๋ค ๊ฒ์์ฌ์ฉํ ์ง๋ FilterChainProxy๊ฐ ๊ฒฐ์
- ๊ฐ์ฅ ๋จผ์ ๋งค์นญํ SecurityFilterChain์ ์คํ
'Study > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Filter vs Interceptor (0) | 2022.07.25 |
---|---|
[TIL] Spring Security ์ธ์ฆ (0) | 2022.07.25 |
[TIL] API ๋ฌธ์ํ (0) | 2022.07.21 |
[TIL] ์ธ์ฆ/๋ณด์ (0) | 2022.07.21 |
[TIL] ์ฌ๋ผ์ด์ค ํ ์คํธ (0) | 2022.07.14 |