๐ŸŽณ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ - ํ† ํฐ ์ •๋ณด ์„ค์ •

ํƒœ๊ทธ
Test
Security
์ž‘์„ฑ์ž
์ž‘์„ฑ ๋‚ ์งœ
Nov 19, 2022 09:29 AM
 
๐Ÿ†
๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋ˆ„๊ฐ€ ๋‚ด์šฉ ๋ณด์ถฉ์ข€ ํ•ด์ฃผ์„ธ์š” ๐ŸคŸ

์ปจํŠธ๋กค๋Ÿฌ์—์„œ Authentication ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ!

notion image
์กฐ๊ธˆ ์–ต์ง€์Šค๋Ÿฌ์šด ์˜ˆ์ œ์ด๊ธด ํ•˜์ง€๋งŒโ€ฆ ๐Ÿ˜“  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์œ„์™€ ๊ฐ™์ด @AuthenticationPrincipal๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ† ํฐ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
 
์ด ๊ฒฝ์šฐ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๊ทธ๋ƒฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ํ† ํฐ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ฑ
notion image
 
๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ† ํฐ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ธ์Šคํƒ€๋€จ๋žจ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿซ 
notion image
 
โœจโœจ ์ด๋ฅผ ์กฐ๊ธˆ ๋” ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
notion image
public class WithMockJwtAuthenticationSecurityContextFactory implements WithSecurityContextFactory<WithMockJwtAuthentication> { @Override public SecurityContext createSecurityContext(WithMockJwtAuthentication annotation) { SecurityContext context = SecurityContextHolder.createEmptyContext(); JwtAuthenticationToken authentication = new JwtAuthenticationToken( new JwtAuthentication(annotation.token(), annotation.id(), annotation.username()), null, createAuthorityList(annotation.role()) ); context.setAuthentication(authentication); return context; } }
@Retention(RetentionPolicy.RUNTIME) @WithSecurityContext(factory = WithMockJwtAuthenticationSecurityContextFactory.class) public @interface WithMockJwtAuthentication { String token() default "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwicm9sZXMiOlsiVVNFUiJdLCJpc3MiOiJzZmFtIiwiZXhwIjoxNjU4NTkyNTYyLCJpYXQiOjE2NTg1OTI1MzIsInVzZXJJZCI6MSwidXNlcm5hbWUiOiJ0ZXN0MDAifQ.FDkOUzhLvKOYFmjOxRtF-dRDSO2BkoplJTMIyhp0c0ajxOLeZbKuekSyySnCnjVvv_f0Qx8T7a3ZS2OlaSGiDQ"; long id() default 1L; String username() default "test00"; String role() default "USER"; }
ํ† ํฐ ์„ค์ •์— ํ•„์š”ํ•œ ํ•„๋“œ๋“ค๊ณผ ํ•จ๊ป˜ Default ๊ฐ’๋“ค์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์œผ๋กœ ํ† ํฐ ์ •๋ณด๊ฐ€ ์„ค์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฐ’์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ application-mem.yml์˜ ํ…Œ์ŠคํŠธ ํ‚ค๋กœ ๋งŒ๋“  ๊ฐ’์ž…๋‹ˆ๋‹ค. (๋ฐฐํฌ ํ™˜๊ฒฝ์˜ ์‹ค์ œ ํ‚ค๋กœ ๋งŒ๋“  ํ† ํฐ์„ ๋„ฃ๋Š”๊ฑด ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๐Ÿซ  )
    • notion image
๐Ÿ™…โ€โ™‚๏ธ
ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— Default๊ฐ’์„ ๋ณ€๊ฒฝ์€ ํŒ€์›๋“ค ๊ฒ€ํ†  ํ›„์— ํ•ด์ฃผ์„ธ์š”.
 

โœจ ์„ค์ •์€ ์ด์ œ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค.

์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๋ฉด ์ด์ œ ํ† ํฐ ์ •๋ณด๊ฐ€ ์œ„์˜ ํด๋ž˜์Šค์—์„œ ์„ค์ •๋œ ์ •๋ณด๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
notion image
  • ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ•ด๋ณด๋ฉด ์ƒํผํ•˜๊ฒŒ ์„ฑ๊ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • notion image
 

๋—โ€ฆ?

์ •๋ณด๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค๋ฉด ์•„๋ž˜์˜ ๋ธ”๋กœ๊ทธ๊ฐ€ ์ฐธ๊ณ ๊ฐ€ ๋ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ‘
Spring Security๊ฐ€ ์ ์šฉ๋œ ๊ณณ์„ ํšจ์œจ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ž.
Spring Security์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋‹ค๋ณด๋ฉด ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ ์ „์— SecurityContext์— ์ง์ ‘ Authentication์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ, ์ธ์ฆ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ํ•ญ์ƒ SecurityContext์— Authentication์„ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, setUp์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ฉ”์„œ๋“œ์—์„œ ์š”๊ตฌ๋˜๋Š” ๊ถŒํ•œ ์„ค์ •์ด ๋ฐ”๋€” ๊ฒฝ์šฐ, SecurityContext๋ฅผ ๋น„์šฐ๊ณ  ๋‹ค์‹œ ์›ํ•˜๋Š” ์ •๋ณด๋กœ ์ฑ„์›Œ์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
Spring Security๊ฐ€ ์ ์šฉ๋œ ๊ณณ์„ ํšจ์œจ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ž.