๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

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..
KIMHYEYUN
'๋‚ด์ผ๋ฐฐ์›€์บ ํ”„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)