CSRF ๐ฅ CSRF (์ฌ์ดํธ ๊ฐ ์์ฒญ ์์กฐ, Cross-Site Ruquest Forgery) ๊ณต๊ฒฉ์๊ฐ ์ธ์ฆ๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ ์ฟ ํค์ ์ธ์
์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ์น ์๋ฒ์ ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ์์ฒญ์ ์ ๋ฌํ๋ ๊ฒ CSRF ์ค์ ์ด ๋์ด์๋ ๊ฒฝ์ฐ html์์ CSRF ํ ํฐ ๊ฐ์ ๋๊ฒจ์ฃผ์ด์ผ ์์ฒญ์ ์์ ๊ฐ๋ฅ ์ฟ ํค ๊ธฐ๋ฐ์ ์ทจ์ฝ์ ์ ์ด์ฉํ ๊ณต๊ฒฉ์ด๊ธฐ ๋๋ฌธ์ REST ๋ฐฉ์์ API์์๋ disable ๊ฐ๋ฅ POST ์์ฒญ๋ง๋ค ์ฒ๋ฆฌํด์ฃผ๋ ๋์ CSRF protection์ disable Spring Security - Filter Chain Spring ์์ ๋ชจ๋ ํธ์ถ์ DispatcherServlet์ ํต๊ณผํ๊ฒ ๋๊ณ ์ดํ์ ๊ฐ ์์ฒญ์ ๋ด๋นํ๋ Controller๋ก ๋ถ๋ฐฐ ์ด ๋, ๊ฐ ์์ฒญ์ ๋ํด์ ๊ณตํต์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ..
๋ด์ผ๋ฐฐ์์บ ํ
ํํฐ Filter๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ด๋ฆฌ๋๋ ์์ญ์ผ๋ก Client๋ก๋ถํฐ ์ค๋ ์์ฒญ๊ณผ ์๋ต์ ๋ํด ์ต์ด/์ต์ข
๋จ๊ณ์ ์์น์ด๋ฉฐ, ์ด๋ฅผ ํตํด ์์ฒญ๊ณผ ์๋ต์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ ๊ฐ๋ฅ ์ฃผ๋ก ๋ฒ์ฉ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์์
๋ค, ์๋ฅผ ๋ค์ด ๋ก๊น
๋ฐ ๋ณด์ ์ฒ๋ฆฌ์ ํ์ฉ ๋ํ ์ธ์ฆ, ์ธ๊ฐ๊ฐ ๊ด๋ จ๋ ๋ก์ง๋ค์ ์ฒ๋ฆฌ ๊ฐ๋ฅ Filter๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์ฆ, ์ธ๊ฐ์ ๊ด๋ จ๋ ๋ก์ง์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์กด์ฌ Filter Chain ํํฐ๋ ์ฌ๋ฌ ๊ฐ๊ฐ Chain ํ์์ผ๋ก ๋ฌถ์ฌ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ ํํฐ ์ ์ฉ ์์ฒญ URL์ ์ธ๊ฐ ์ฒ๋ฆฌ ๋ฐ ์ธ์ฆ ์ฒ๋ฆฌ ์งํํ๋ ํํฐ ๊ตฌํ ์ถ๊ฐ๋ก ์์ฒญ URL์ ๋ก๊น
ํด์ฃผ๋ ํํฐ ๊ตฌํ Request URL Logging @Slf4j(topic = "LoggingFilter") @..
JWT Json Web Token ์ด๋, JSON ํฌ๋งท์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ clain ๊ธฐ๋ฐ์ Web Token ์ฆ, ํ ํฐ์ ํ ์ข
๋ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฟ ํค ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ JWT ์ ์ฅ ์ฌ์ฉ ์ด์ ์๋ฒ๊ฐ 1๋์ธ ๊ฒฝ์ฐ Session1์ด ๋ชจ๋ client์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์์ ์๋ฒ๊ฐ 2๋ ์ด์์ธ ๊ฒฝ์ฐ ์๋ฒ์ ๋์ฉ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋ฒ 2๋ ์ด์ ์ด์์ด ํ์ Session ๋ง๋ค ๋ค๋ฅธ Client ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ ์ ์์ ๋ง์ฝ Client1์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ Server2 ๋ Server3์ API ์์ฒญ์ ํ๊ฒ ๋๋ฉด? ํด๊ฒฐ ๋ฐฉ๋ฒ 1) Sticky Session : Client ๋ง๋ค ์์ฒญ Server ๊ณ ์ 2) ์ธ์
์ ์ฅ์๋ฅผ ์์ฑํ์ฌ ๋ชจ๋ ์ธ์
์ ์ฅ ์ธ์
์ ์ฅ์ ์..
์ฟ ํค์ ์ธ์
์ฟ ํค์ ์ธ์
๋ชจ๋ HTTP ์ ์ํ ์ ๋ณด๋ฅผ ์ ์ง(Stateful)ํ๊ธฐ ์ํด ์ฌ์ฉ ์ฆ, ์ฟ ํค์ ์ธ์
์ ํตํด ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ ๋ณ๋ก ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๊ฐ๋ฅ ์ฟ ํค ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ๋ชฉ์ ์ผ๋ก ์์ฑํ ์์ ์ ๋ณด๋ฅผ ๋ด์ ํ์ผ ๋๋ฉ์ธ ๋ณ๋ก ์ ์ฅ๋์ด ์์ ๊ตฌ์ฑ์์ Name : ์ฟ ํค๋ฅผ ๊ตฌ๋ณํ๋๋ฐ ์ฌ์ฉ๋๋ ํค(์ค๋ณตx) Value : ์ฟ ํค์ ๊ฐ Domain : ์ฟ ํค๊ฐ ์ ์ฅ๋ ๋๋ฉ์ธ Path : ์ฌ์ฉ๋๋ ๊ฒฝ๋ก Expires : ๋ง๋ฃ๊ธฐํ ์ธ์
์๋ฒ์์ ์ผ์ ์๊ฐ ๋์ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ ์๋ฒ์์ ํด๋ผ์ด์ธํธ ๋ณ๋ก ์ ์ผํ '์ธ์
ID'๋ฅผ ๋ถ์ฌํ ํ ํ์ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅ '์ธ์
ID'๋ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๊ฐ์ผ๋ก ์ ์ฅ๋์ด ํด๋ผ์ด์ธํธ ์๋ณ์ ์ฌ์ฉ๋จ ๋์ ๋ฐฉ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ..
์ธ์ฆ๊ณผ ์ธ๊ฐ ์ธ์ฆ(Authentication) ํด๋น ์ ์ ๊ฐ ์ค์ ์ ์ ์ธ์ง ์ธ์ฆ(ํ์ธ) ๊ฐ๋
ex. ์ค๋งํธํฐ ์ง๋ฌธ์ธ์, ๋ก๊ทธ์ธ ๋ฑ ์ธ๊ฐ(Authorization) ํด๋น ์ ์ ๊ฐ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ํ๊ฐ ํ์ธ ๊ฐ๋
ex. ๊ด๋ฆฌ์ ํ์ด์ง - ๊ด๋ฆฌ์ ๊ถํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ธ์ฆ์ ํน์์ฑ ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ - ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ, ๋ฌผ๋ฆฌ์ ๊ฑฐ๋ฆฌ ์กด์ฌ HTTP ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ํต์ -> ๋น์ฐ๊ฒฐ์ฑ(Connectionless) ๋ฌด์ํ(Stateless)๐ ๋น์ฐ๊ฒฐ์ฑ(Connectionless) : ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ๋์ง ์์์ ์๋ฏธ ์ฑํ
์ด๋ ๊ฒ์๊ฐ์ ๊ฒ์ ํ์ง ์๋ ์ด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ์ค์ ๋ก ์ฐ๊ฒฐ โ -> ๋ฆฌ์์ค ์ ์ฝ์ ์ํด ์๋ฒ๋ ํ๋์ ์์ฒญ์ ํ๋์ ์๋ต์ ์ฃผ๊ณ ์ฐ๊ฒฐ ๋์ ๐ ๋ฌด์ํ(Stateless)..
Bean ๋ฑ๋ก ์๋ ๋ฑ๋ก ? @Component ์ฌ์ฉ ์, @ComponentScan์ ์ํด ์๋์ผ๋ก ํด๋น ํด๋์ค Bean์ผ๋ก ๋ฑ๋ก ๐โ๏ธ ๊ทธ๋ฐ๋ฐ ์ ์๋์ผ๋ก ๋ฑ๋ก?? ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด ๋น์ฆ๋์ค ๋ก์ง Bean๋ณด๋ค ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ด์ค๋ฝ์ง ์์ ์๋ ๋ฑ๋ก๋ Bean์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น ์์น๋ฅผ ํ์
ํ๊ธฐ ์ฌ์ ์๋ ๋ฑ๋ก ๋ฐฉ๋ฒ @Configuration public class PasswordConfig { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } } ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ @Bean ๋ฉ์๋๊ฐ ์ํ ํด๋์ค @Configuration Spring IoC..
Spring Data JPA SpringBoot ํ๊ฒฝ์์์ JPA SpringBoot ํ๊ฒฝ์์๋ EntityManagerFactory์ EntityManager๋ฅผ ์๋์ผ๋ก ์์ฑ application.properties์ DB ์ ๋ณด๋ฅผ ์ ๋ฌํด ์ฃผ๋ฉด ์ด๋ฅผ ํ ๋๋ก EntityManagerFactory๊ฐ ์์ฑ๋จ@PersistenceContext EntityManager em; @PersistenceContext ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์์ฑ๋ EntityManager๋ฅผ ์ฃผ์
๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ Spring์ ํธ๋์ญ์
Spring ํ๋ ์์ํฌ์์ DB์ ํธ๋์ญ์
๊ฐ๋
์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉํ ์ ์๋๋ก ํธ๋์ญ์
๊ด๋ฆฌ์๋ฅผ ์ ๊ณต @Transactional(readOnly = true) public class SimpleJ..
Entity์ ์ํ ๋น์์(Transient) Memo memo = new Memo(); // ๋น์์ ์ํ memo.setId(1L); memo.setUsername("Robbie"); memo.setContents("๋น์์๊ณผ ์์์ํ); new ์ฐ์ฐ์๋ฅผ ํตํด ์ธ์คํด์คํ ๋ Entity ๊ฐ์ฒด ์์ง ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ๋์ง ์์๊ธฐ ๋๋ฌธ์ JPA์ ๊ด๋ฆฌ๋ฅผ ๋ฐ์ง ์์ ์์(Managed) em.persist(memo); persist(entity) : ๋น์์ Entity๋ฅผ EntityManager๋ฅผ ํตํด ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๊ณ ์๋ ์ํ๋ก ๋ง๋ฌ ์ค์์(Detacthed) ์ค์์ ์ํ๋ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ๋ฅผ ์๋ฏธ ์์ ์ํ -> ์ค์์ ์ํ detach() em.de..