Skip to content

godngu/security-jwt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

17 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํ…Œ์ŠคํŠธ ๊ณ„์ • (id/pw)

ํ…Œ์ŠคํŠธ ์ฃผ์˜์‚ฌํ•ญ

  • ํ…Œ์ŠคํŠธ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๋กœ์ง
    • DataInitializer.java
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ ๋ฆฌ์†Œ์Šค๊ถŒํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ application.yml ์—์„œ ddl_auto: create๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด DB ํ…Œ์ด๋ธ”์ด ๋น„์–ด์žˆ์–ด์„œ url ๊ถŒํ•œ๊ฒ€์‚ฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ ddl_auto: update๋กœ ์„ค์ •ํ•œ ํ›„ ์ตœ์ดˆ 1ํšŒ ์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•˜์—ฌ DB ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ ํ›„์— ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Resources

permitAll

  • GET /
  • GET /hello
  • POST /login

์ธ์ฆ ํ•„์š”

Method Resource Role
GET /api/hello/admin ROLE_ADMIN
GET /api/hello/manager ROLE_MANAGER
GET /api/hello/user ROLE_USER

์ฃผ์š” ์ธ์ฆ classes

class type Login ์ฒ˜๋ฆฌ Token ์ธ์ฆ
filter LoginAuthenticationFilter JwtAuthenticationFilter
provider LoginAuthenticationProvider JwtAuthenticationProvider
authentication UsernamePasswordAuthenticationToken JwtAuthenticationToken
๊ณตํ†ต SecurityMemberContext

์ฃผ์˜ํ• ์ ?

์ง„์ž…๋  Filter์™€ ์ฒ˜๋ฆฌํ•  Provider ๊ฒฐ์ •ํ•˜๊ธฐ

  • filter๋Š” SecurityConfig ์—์„œ ์„ค์ •๋˜๋ฉฐ, RequestMatcher์— ์˜ํ•ด url ํŒจํ„ด์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • provider์˜ supports ๋ฉ”์†Œ๋“œ์— ์ •์˜๋œ token class๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋  provider๊ฐ€ ์ •ํ•ด์ง‘๋‹ˆ๋‹ค.
// JwtAuthenticationFilter ์—์„œ JwtAuthenticationToken ์„ค์ •
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
    throws AuthenticationException, IOException, ServletException {

    String token = extractToken(request);
    return this.getAuthenticationManager().authenticate(
        new JwtAuthenticationToken(token));
}
// JwtAuthenticationProvider ์—์„œ JwtAuthenticationToken.class ์„ค์ •
@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(JwtAuthenticationToken.class);
}

SecurityMemberContext ๊ณตํ†ต ์‚ฌ์šฉ

  • ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ์™„๋ฃŒ, ํ† ํฐ์ธ์ฆ ์ฒ˜๋ฆฌ ์™„๋ฃŒ์‹œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” SecurityContext์—์„œ ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
SecurityMemberContext memberContext = (SecurityMemberContext) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  • ์ด๋ ‡๊ฒŒ ์„ค์ •์„ ํ•˜๋ฉด JPA์— ์˜ํ•œ ์ž๋™ audit ์ฒ˜๋ฆฌ์‹œ ๋™์ผํ•œ ๋กœ์ง์œผ๋กœ memberId๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋™ audit ์ฒ˜๋ฆฌ๋ž€, insert/update ์‹œ ๋“ฑ๋ก์ž/์ˆ˜์ •์ž์— ๋Œ€ํ•œ ํšŒ์› id๋ฅผ ์ž๋™ ์„ธํŒ…ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

DB๋ฅผ ํ†ตํ•œ URL ๊ธฐ๋ฐ˜์˜ ๊ถŒํ•œ๊ด€๋ฆฌ

  • FilterInvocationSecurityMetadataSource ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์„ค์ •

SecurityResourceService

  • ResourceRole ํ…Œ์ด๋ธ”์—์„œ ๋ฆฌ์†Œ์Šค๊ถŒํ•œ์„ ์กฐํšŒํ•˜์—ฌ LinkedHashMap<RequestMatcher, List<ConfigAttribute>>์œผ๋กœ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

UrlResourcesMapFactoryBean

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋™๋  ๋•Œ DB๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๊ถŒํ•œ ์ •๋ณด(RESOURCE_ROLE)๋ฅผ ์กฐํšŒํ•˜์—ฌ LinkedHashMap์— ๋‹ด์•„๋‘ก๋‹ˆ๋‹ค.

UrlFilterInvocationSecurityMetadataSource

  • ๋ฆฌ์†Œ์Šค๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์กฐํšŒ๋œ LinkedHashMap์„ ๋Œ€์ƒ์œผ๋กœ resource ์š”์ฒญ์ด ์žˆ์„ ๊ฒฝ์šฐ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์› ์ ‘๊ทผ์— ๋Œ€ํ•œ ํŒ๋‹จ์€ AccessDecisionManager์˜ ๊ตฌํ˜„์ฒด์ธ AffirmativeBased๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์ 

  • Application ๋กœ๋”ฉ์‹œ DB๋กœ ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค์™€ ๊ถŒํ•œ ๊ด€๊ณ„๋ฅผ ์กฐํšŒํ•˜์—ฌ LinkedHashMap์— ๋‹ด์•„๋‘๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ DB ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ ๋œ๋‹ค๋ฉด Map์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
      • ๋Œ€์•ˆ1. reload ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , DB๊ฐ’ ๋ณ€๊ฒฝ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์ ์žฌ ํ•ฉ๋‹ˆ๋‹ค.
        • ์„œ๋ฒ„๊ฐ€ ์ด์ค‘ํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ „ํŒŒ์‹œํ‚ค์ง€?
      • ๋Œ€์•ˆ2. ๋ชจ๋“  url ํ˜ธ์ถœ์‹œ DB๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
        • ์„ฑ๋Šฅ์— ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ์ค„๊นŒ?
      • ๋Œ€์•ˆ3. ์ ์ ˆํ•  cache์˜ ํ™œ์šฉ

๊ณ„์ธต ๊ถŒํ•œ ์ ์šฉ

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

  • ADMIN > MANAGER > USER
  • MANAGER ๋กœ๊ทธ์ธ
    • USER ๋ฆฌ์†Œ์Šค: O
    • ADMIN ๋ฆฌ์†Œ์Šค: X (403 Forbidden)

RoleHierarchyServiceImpl

  • ๋ฐ˜๋“œ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ ๋˜์–ด์•ผ ํ•œ๋‹ค.
{๋ถ€๋ชจ ๊ถŒํ•œ๋ช…} > {์ž์‹ ๊ถŒํ•œ๋ช…}  
{์ž์‹ ๊ถŒํ•œ๋ช…} > {์†์ž ๊ถŒํ•œ๋ช…}  
ROLE_ADMIN > ROLE_MANAGER  
\nROLE_MANAGER > ROLE_USER

SecurityInitializer

  • ๊ณ„์ธต ๊ถŒํ•œ์ด ์ ์šฉ๋˜๋Š” ์‹œ์ ์„ ApplicationRunner์— ์„ค์ •ํ•œ๋‹ค.

PermitAllFilter

  • ์–ด๋– ํ•œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด AbstractSecurityInterceptor์—์„œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ์‹ฌ์‚ฌ๋ฅผ ํ•œ๋‹ค.
  • PermitAllFilter๋ฅผ ์ ์šฉํ•˜๋ฉด ์ธ๊ฐ€์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋Š” ๋Œ€์ƒ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•ด์„œ ๊ถŒํ•œ ์‹ฌ์‚ฌ ์—†์ด ๋ฐ”๋กœ ํ†ต๊ณผ ๋œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด AbstractSecurityInterceptor ์ „์— ์ฒ˜๋ฆฌ๋œ๋‹ค.
    • ๊ถŒํ•œ ์‹ฌ์‚ฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋Œ€์ƒ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ ๋ณ„ํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ๋žตํ•œ๋‹ค.
    • ํšจ์œจ์ ์ด๋‹ค.
  • beforeInvocation๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋กœ์ง์„ ๊ฐœ๋ฐœํ•œ๋‹ค.

About

๐Ÿ” Spring Security With JWT ๐Ÿช™

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages