Spring

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) ExceptionTraslationFilter, RequestCacheAwareFilter

๐ŸŒฑ ์˜ˆ์™ธ AuthenticationException ์ธ์ฆ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ AuthenticationEntryPoint ํ˜ธ์ถœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ด๋™, 401 ์˜ค๋ฅ˜ ์ฝ”๋“œ ์ „๋‹ฌ ๋“ฑ ์ธ์ฆ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ €์žฅ RequestCache : ์‚ฌ์šฉ์ž ์ด์ „ ์š”์ฒญ ์ •๋ณด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ๊บผ๋‚ด์˜ค๋Š” ์บ์‹œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ SavedRequest : ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ–ˆ๋˜ request ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋“ค, ๊ทธ ๋‹น์‹œ ํ—ค๋” ๊ฐ’๋“ค ๋“ฑ์ด ์ €์žฅ AccessDeniedExeption ์ธ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ AccessDeniedHandler์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ œ๊ณต ๐Ÿ‘‰ ์ด๋Ÿฐ ์˜ˆ์™ธ๋Š” FilterSecurityInterceptor์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด ํ•„ํ„ฐ ์•ž์— ์žˆ๋Š” ํ•„ํ„ฐ๊ฐ€ ExceptionTranslationFilter์ž„ ๊ทธ๋ž˜์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Filte..

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) ๊ถŒํ•œ์„ค์ •๊ณผ ํ‘œํ˜„์‹

๊ถŒํ•œ ์„ค์ • ๋ฐฉ์‹์—๋Š” ์„ ์–ธ์  ๋ฐฉ์‹๊ณผ ๋™์  ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. ์„ ์–ธ์  ๋ฐฉ์‹ 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

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) ๋™์‹œ ์„ธ์…˜ ์ œ์–ด, ์„ธ์…˜ ๊ณ ์ • ๋ณดํ˜ธ, ์„ธ์…˜ ์ •์ฑ…

๐ŸŽ  ๋™์‹œ ์„ธ์…˜ ์ œ์–ด ๋™์‹œ ์„ธ์…˜ ์ œ์–ด๋Š” ํ˜„์žฌ ๋™์ผํ•œ ๊ณ„์ •์œผ๋กœ ์ธ์ฆ์„ ๋ฐ›์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์„ธ์…˜์˜ ํ—ˆ์šฉ ๊ฐœ์ˆ˜๊ฐ€ ์ดˆ๊ณผ๋˜์—ˆ์„ ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ๊ทธ ์„ธ์…˜์„ ๊ณ„์†์ ์œผ๋กœ ์ดˆ๊ณผํ•˜์ง€ ์•Š๊ณ  ์„ธ์…˜์„ ์œ ์ง€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋งํ•œ๋‹ค. ํ—ˆ์šฉ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•  ๊ฒฝ์šฐ์— (์‚ฌ์šฉ์ž 1, 2๋Š” ๋™์ผํ•œ ๊ณ„์ •) 1.์ด์ „ ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋งŒ๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ• 2. ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹คํŒจ ๋™์‹œ ์„ธ์…˜ ์ œ์–ด API maximumSessions : ์„ค์ •ํ•œ ์ˆ˜๋งŒํผ ์ตœ๋Œ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅ ์„ธ์…˜ ์ˆ˜๋ฅผ ์„ค์ • maxSessionPreventsLogin : true๋กœ ์„ค์ •ํ•˜๋ฉด ๋™์‹œ ๋กœ๊ทธ์ธ ์ฐจ๋‹จํ•จ -> ์œ„์—์„œ 2๋ฒˆ์งธ ๋ฐฉ๋ฒ•, false๋Š” 1๋ฒˆ์งธ ๋ฐฉ๋ฒ• invalidSessionUrl expireUrl ๐Ÿ‘‰ ๋ฐ‘์— ๋‘ ๊ฐœ ๋‹ค ์„ค์ •ํ•˜๋ฉด invalidSessionUrl์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ..

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) ์ต๋ช…์‚ฌ์šฉ์ž ์ธ์ฆ : AnonymousAuthenticationFilter

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

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) Remember-Me ์ธ์ฆ

๐ŸŽ€ Remember-Me ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. โž• Remember-Me ์ฟ ํ‚ค์— ๋Œ€ํ•œ http์š”์ฒญ์„ ํ™•์ธํ•œ ํ›„ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•ด ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ† ํฐ์ด ๊ฒ€์ฆ๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ๋œ๋‹ค. ์‚ฌ์šฉ์ž ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ธ์ฆ ์„ฑ๊ณต (Remember-Me ์ฟ ํ‚ค ์„ค์ •) ์ธ์ฆ ์‹คํŒจ (์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ฟ ํ‚ค ๋ฌดํšจํ™”) ๋กœ๊ทธ์•„์›ƒ (์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ฟ ํ‚ค ๋ฌดํšจํ™”) rememberMeParameter : ๋ฒ„ํŠผ ์ด๋ฆ„์ด๋ž‘ ๋˜‘๊ฐ™์ด ํ•ด์•ผ ๋จ alwaysRemember(true) : ๋กœ๊ทธ์ธํ•  ๋•Œ ๋ฆฌ๋ฉค๋ฒ„ ๋ฏธ ์‚ฌ์šฉ ์•ˆ ํ•ด๋„ ํ™œ์„ฑํ™”๋˜์–ด์žˆ์Œ userDetailsService๋Š” ํ•„์ˆ˜ ํ•ด๋‹น ์„ค์ •์„ ํ•˜๊ณ  ๋‚˜์„œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Remember me on this comput..

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) Logout์ฒ˜๋ฆฌ, LogoutFilter

๐ŸŒฑ ์ „์ฒด์ ์ธ ๋กœ๊ทธ์•„์›ƒ ๋กœ์ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์„ธ์…˜ ๋ฌดํšจํ™” ์ธ์ฆ ํ† ํฐ ์‚ญ์ œ ์‚ญ์ œํ•  ์ฟ ํ‚ค ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ญ์ œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋กœ๊ทธ์•„์›ƒ API logout : ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” logoutUrl : ๋กœ๊ทธ์•„์›ƒ url ์ •๋ณด ์ „๋‹ฌ (form ํƒœ๊ทธ์—์„œ url ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ) logoutSuccessUrl : ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณตํ•  ๋•Œ ์ด๋™ํ•  url deleteCookies : ์ฟ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ํ–ˆ์„ ๊ฒฝ์šฐ์— ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•จ remember-me ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‚˜์ค‘์— ๋กœ๊ทธ์ธํ•  ๋•Œ remember-me ์ธ์ฆ์ด ์žˆ๋Š”๋ฐ ์„œ๋ฒ„์—์„œ ๋งŒ๋“  ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ logoutSuccessHandler : ๋กœ๊ทธ์•„์›ƒ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ํ›„์† ์ž‘์—…์„ ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ๋กœ๊ทธ์•„์›ƒ filter ..

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) Form Login ์ธ์ฆ

๐ŸŒฑ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์ธ ๋กœ์ง form์„ ํ†ตํ•ด์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์„ธ์…˜ ๋ฐ ์ธ์ฆ ํ† ํฐ์„ ์ €์žฅํ•œ๋‹ค. ์ถ”ํ›„์—๋Š” ํ•ด๋‹น ์ธ์ฆ์„ ํ†ตํ•ด์„œ ์ž‘์—… ๊ฐ€๋Šฅํ•˜๋‹ค. ๋กœ๊ทธ์ธ API ์—ฌ๊ธฐ์„œ ๋ง๋ถ™์—ฌ์„œ ์„ค๋ช…ํ•˜๋ฉด loginProcessingUrl : form ํƒœ๊ทธ์— ์žˆ๋Š” action url , ํƒ€์ž„๋ฆฌํ”„ ์“ฐ๋ฉด th:action successHandler : ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋‚ด๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ failureHandler : ์‹คํŒจํ–ˆ์„ ๋•Œ ๋‚ด๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ๐Ÿ‘‰ successUrl์ด๋ž€ failureUrl์ด๋ž‘ ๋น„์Šทํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์•ž์— ๋‘ ๊ฐœ๋Š” url์„ค์ •๋ฐ–์— ํ•˜์ง€ ๋ชปํ•œ๋‹ค. Controller @GetMapping("/loginPage") public Strin..

Spring

[Spring] Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ) ๊ธฐ์ดˆ ๊ฐœ๋…

๊ฐ•์˜๋“ค์œผ๋ฉด์„œ ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ๋ผ๋„ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค! ๐Ÿฅ Spring Security(์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ)๋ž€? Spring ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š” Spring ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. springboot์— spring security๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค. implementation 'org.springframework.boot:spring-boot-starter-security' ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์€? ์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™๋˜๋ฉด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ์ดˆ๊ธฐํ™” ์ž‘์—… ๋ฐ ๋ณด์•ˆ ์„ค์ •์ด ์ด๋ฃจ์–ด์ง ๋ณ„๋„์˜ ์„ค์ •์ด๋‚˜ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์ธ ์›น ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ํ˜„์žฌ ์‹œ์Šคํ…œ์— ์—ฐ๋™๋ผ ์ž‘๋™ ๋ชจ๋“  ์š”์ฒญ์€ ์ธ์ฆ์ด ๋˜์–ด์•ผ ์ž์›์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ ์ธ์ฆ ๋ฐฉ์‹์€ Form ๋กœ๊ทธ์ธ ๋ฐฉ์‹๊ณผ ..

Spring

[Spring] Dirty Checking(๋”ํ‹ฐ ์ฒดํ‚น) ์ด๋ž€?

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ repository.save()๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ update ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์–ด DB์— ๋ฐ˜์˜๋˜๋Š” ํ˜„์ƒ์„ ๋ณด๊ณ  Dirty Checking์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค ๐Ÿค” โš™๏ธ Dirty Checking์ด๋ž€? Spring JPA์—์„œ ๋”ํ‹ฐ ์ฒดํ‚น์ด๋ž€ ์˜์†์„ฑ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•ด์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ž๋™์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋Š” ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. dirty : ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ ๋ฐ์ดํ„ฐ dirty checking : ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„ ๊ฐ์ง€ Dirty Checking์€ ์–ธ์ œ ์ผ์–ด๋‚ ๊นŒ? ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ ์ค€์˜์†/๋น„์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋”ํ‹ฐ ์ฒดํ‚น์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. Transaction(ํŠธ๋žœ์žญ์…˜)์ด ์ปค๋ฐ‹๋˜์—ˆ์„ ๋•Œ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ธฐ ์ „๊นŒ์ง€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋ณ€..

Spring

[Spring] Service, ServiceImpl ๊ตฌ์กฐ

Service์™€ ServiceImpl์„ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋ด์„œ ํ•œ ๋ฒˆ ์กฐ์‚ฌํ•ด ๋ดค๋‹คโœ๏ธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋ฅผ ๋”ฐ๋กœ ๋‘๋Š” ๊ฑด OCP(๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™) ๋•Œ๋ฌธ์ด๋‹ค. ๐Ÿ”ธ OCP๋ž€? ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ฑ„๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค์žˆ์–ด์•ผ ํ•˜๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์ด๋‹ค. ์ด ์›์น™์ด ์ž˜ ์ ์šฉ๋˜๋ฉด, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒจํ•ด์•ผ ํ•  ๋•Œ ์ด๋ฏธ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ์กด์˜ ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๋‚˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๐Ÿ”ธ Service์™€ ServiceImpl sevice๋ฅผ ๋จผ์ € ์ •์˜ํ•˜๊ณ , serviceimpl์ด service ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Controller์—์„œ๋Š” service๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค!! ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ ์šฉ..

DAHLIA CHOI
'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)