Authorization Filter

๊ถŒํ•œ ๊ณ„์ธต

์›น ๊ณ„์ธต

URL์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ฉ”๋‰ด/ํ™”๋ฉด ๋‹จ์œ„์˜ ๋ ˆ๋ฒจ ๋ณด์•ˆ

/user ->request -> ROLE_USER

์„œ๋น„์Šค ๊ณ„์ธต

๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋‹จ์œ„์˜ ๋ ˆ๋ฒจ ๋ณด์•ˆ

user() ->invoke-> ROLE_USER

๋„๋ฉ”์ธ ๊ณ„์ธต

๊ฐ์ฒด ๋‹จ์œ„์˜ ๋ ˆ๋ฒจ ๋ณด์•ˆ

user ->write-> ROLE_USER

์„ ์–ธ์  ๋ฐฉ์‹

URL

http.antMathcers("/user/**").hasRole("USER")

WebSecurityConfigurerAdapter๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์—์„œ configure๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„ url์ด ์•ž์— ์™€์•ผํ•œ๋‹ค.

http
    .antMathcer("/shop/**")
    .authorizeRequest()
        .antMathcers("/shop/login", "/shop/users/**").permitAll()
        .antMathcers("/shop/mypage").hasRole("USER")
        .antMathcers("/shop/admin/pay").access("hasRole('ADMIN') or hasRole('SYS')")
        .anyRequest().authenticated();

/shopํ•˜์œ„ ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด ๊ทธ ๋ฐ‘์˜ ์ธ์ฆ์„ธํŒ…์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ƒ์œ„์˜ antMathcer์ด ์—†๋‹ค๋ฉด ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด authorizeRequest()๋ฅผ ์ˆ˜ํ–‰

๋ฉ”์„œ๋“œ๊ธฐ๋Šฅ

authenticated()

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ ‘๊ทผ ํ—ˆ์šฉ

fullyAuthenticated()

remberMe์ธ์ฆ ์ œ์™ธํ•œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ ‘๊ทผ ํ—ˆ์šฉ

permitAll()

๋ฌด์กฐ๊ฑด ์ ‘๊ทผ ํ—ˆ์šฉ

denyAll()

๋ฌด์กฐ๊ฑด ์ ‘๊ทผ ํ—ˆ์šฉ x

anonymous()

์ต๋ช… ์‚ฌ์šฉ์ž ์ ‘๊ทผ ํ—ˆ์šฉ (์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋Š” ์ต๋ช…์‚ฌ์šฉ์ž์— ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ)

rememberMe()

remberMe๋ฅผ ํ†ตํ•ด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ ‘๊ทผ ํ—ˆ์šฉ

access(String) spEL ํ‘œํ˜„์‹์˜ ํ‰๊ฐ€๊ฐ€ true์ด๋ฉด ์ ‘๊ทผ ํ—ˆ์šฉ

hasRole(String)

ํŠน์ • ์—ญํ• ์ด ์žˆ๋‹ค๋ฉด ํ—ˆ์šฉ (ROLE_ prefix์ƒ๋žต)

hasAuthority(String)

์ฃผ์–ด์ง„ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด ํ—ˆ์šฉ (ROLE_ prefix ํฌํ•จ)

hasAnyRole(String ...)

์ฃผ์–ด์ง„ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ ํ—ˆ์šฉ

hasAnyAuthority(String ...)

์ฃผ์–ด์ง„ ๊ถŒํ•œ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ์ ‘๊ทผ ํ—ˆ์šฉ

hasIpAddress(String)

์ฃผ์–ด์ง„ IP ์ ‘๊ทผ ํ—ˆ์šฉ

Mehtod

@PreAuthorize("hasRole('USER')")
@Secured("USER")

Controller์—์„œ ์œ„์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ๋ฉ”์„œ๋“œ๋ณ„๋กœ ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class CustomConfig extends WebSecurityConfigureAdapter{}

์„ค์ •ํด๋ž˜์Šค์— @EnableGlobalMethodSecurity๋ฅผ ์ด์šฉํ•ด ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋™์  ๋ฐฉ์‹

DB ์—ฐ๋™ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

URL

Method

ExceptionTranslationFilter

FilterSecifityIntercepter๊ฐ€ Filter์˜ ๋งจ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•˜๊ณ  Exception์„ Throwํ•œ๋‹ค. ExceptionTranslationFilter๋Š” ์ด ํ•„ํ„ฐ ์•ž์— ์œ„์น˜ํ•ด์„œ ์š”์ฒญ์„ try~catch๋กœ Intercepter๋ฅผ ๊ฐ์‹ธ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค.

AuthenticationException

์ธ์ฆ ์˜ˆ์™ธ

  1. AuthenticationEntryPoint

    ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ Security๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ์ด๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜์ฝ”๋“œ ์ „๋‹ฌ๋“ฑ ์ˆ˜ํ–‰ (Customํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.)

  2. ์ธ์ฆ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ์ „์˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ €์žฅ

    • RequestCache : ์‚ฌ์šฉ์ž์˜ ์ด์ „ ์š”์ฒญ ์ •๋ณด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ๊บผ๋‚ด ์˜ค๋Š” ์บ์‹œ ๋งค์ปค๋‹ˆ์ฆ˜

      • SavedRequest : ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ–ˆ๋˜ request ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋“ค, ๊ทธ ๋‹น์‹œ์˜ ํ—ค๋”๊ฐ’๋“ค ๋“ฑ์ด ์ €์žฅ

AccessDeniedException

์ธ๊ฐ€ ์˜ˆ์™ธ

  1. AccessDeniedHandler

Anonymous์ด๊ฑฐ๋‚˜ RememberMe ์ธ์ฆ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ AccessDeniedException์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ AccessDeniedHandler๋กœ ๋ณด๋‚ด์ง€ ์•Š๊ณ  AuthenticationException์œผ๋กœ ๋ณด๋‚ธ๋‹ค.

http.exceptionHandling()  //์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์„ค์ •
        .authenticationEntryPoint(customAuthenticationEntryPoint)  //์ธ์ฆ ์‹คํŒจ์‹œ ์ฒ˜๋ฆฌํ•  ํด๋ž˜์Šค
        .accessDenidedHandler(customAccessDenidedHandler())               //์ธ๊ฐ€ ์‹คํŒจ์‹œ ์ฒ˜๋ฆฌํ•  ํด๋ž˜์Šค

FilterSecurityInterceptor

๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•œ ํ•„ํ„ฐ๋กœ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ํŠน์ • ์š”์ฒญ์˜ ์Šน์ธ/๊ฑฐ๋ถ€ ์—ฌ๋ถ€๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ์ •

์ธ์ฆ๊ฐ์ฒด ์—†์ด ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ AuthetnicationException๋ฐœ์ƒ์„ ์‹œํ‚ค๊ณ  ์ ‘๊ทผ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด AccessDeniedException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

๊ถŒํ•œ ์ฒ˜๋ฆฌ๋ฅผ AccessDecisionManager์—๊ฒŒ ๋งก๊ธด๋‹ค.

๊ณผ์ •

  1. ์š”์ฒญ์ด ๋งˆ์ง€๋ง‰ ํ•„ํ„ฐ์ธ FilterSecurityInterceptor์—๊ฒŒ ๋„๋‹ฌ

  2. ์ธ์ฆ ์—ฌ๋ถ€ ์ฒดํฌ ํ›„ ์ธ์ฆ๋œ ๊ฐ์ฒด๋ผ๋ฉด

  3. SecurityMetaDataSource์—์„œ ์š”์ฒญ ๋„๋ฉ”์ธ/์ž์›์— ํ•„์š”ํ•œ ๊ถŒํ•œ/์—ญํ•  ์ •๋ณด ์กฐํšŒ

  4. ๋„๋ฉ”์ธ์— ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์กด์žฌํ•œ๋‹ค๋ฉด AccessDecisionManager์—๊ฒŒ ์ „๋‹ฌ

  5. AccessDecisionManager์—์„œ AccessDecisionVoter์—๊ฒŒ ๊ถŒํ•œ ์‹ฌ์˜ ์š”์ฒญ

  6. AccessDecisionVoter๊ฐ€ ์ตœ์ข… ์Šน์ธ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜

  7. ์ž์› ์ ‘๊ทผ ํ—ˆ์šฉ

AccessDecisionManager

์ ‘๊ทผ, ์ธ๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์—ฌ๋ถ€ ํŒ๋‹จํ•˜๊ณ , ์ ‘๊ทผ ์Šน์ธํ•˜๋Š”๋ฐ ์ •์ฑ…์„ ๊ฒฐ์ •

  • AffirmativeBased: ์ ‘๊ทผ์„ ์Šน์ธํ•˜๋Š” voter๊ฐ€ 1๊ฐœ ์ด์ƒ

  • ConsesusBased: ๊ณผ๋ฐ˜์ˆ˜

  • UnanimouseBased: ๋ชจ๋“  voter๊ฐ€ ์Šน์ธ

    Voter : ๋ง๊ทธ๋ž˜๋„ ํˆฌํ‘œ์ž๋กœ ์˜์‚ฌ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ฐ์ฒด๋“ค. Manager๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ Voter๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

decide(authentication,object,configAttributes)๋ฅผ ์ด์šฉํ•ด Voter์—๊ฒŒ ๊ถŒํ•œ ํŒ๋‹จ์„ ์‹ฌ์‚ฌ

AccessDecisionVoter

ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ธ์ฆlevel์ด ํŠน์ • object ์ ‘๊ทผlevel์— ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ

๊ถŒํ•œ ํŒ๋‹จ ์ž๋ฃŒ

  • Authentication : ์ธ์ฆ ์ •๋ณด(user)

  • FilterInvocation : ์š”์ฒญ ์ •๋ณด(antMathcer("/user"))

  • ConfigAttributes : ๊ถŒํ•œ ์ •๋ณด (hasRole("USER"))

๊ฒฐ์ • ๋ฐฉ์‹

  • ACCESS_GRANTED : ์Šน์ธ

  • ACCESS_DENIED : ๊ฑฐ์ ˆ

  • ACCESS_ABSTAIN : ๋ณด๋ฅ˜

RoleVoter

AccessDecisionVoter ๊ตฌํ˜„์ฒด์ค‘ ํ•˜๋‚˜๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋‹ˆ๊ณ ์žˆ๋Š”์ง€ ํ™•์ธ

WebExpressionVoter

์›น ์‹œํ๋ฆฌํ‹ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด์ค‘ ํ•˜๋‚˜๋กœ, SpELํ‘œํ˜„์‹์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ์ฒ˜๋ฆฌ(ROLE_* ๋งค์น˜๋˜๋Š”์ง€ ํ™•์ธ)

Last updated