# Spring Security - Authentication and Authorization


API์— ๊ถŒํ•œ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด, ์•„๋ฌด๋‚˜ ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ธ์ฆ๋œ ์œ ์ €๋งŒ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ์ฑ… ์ค‘ ํ•˜๋‚˜๊ฐ€ Spring Security๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋กœ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” Spring Security๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ์‰ฝ๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.



Spring Security๋Š” ์Šคํ”„๋ง์˜ DispatcherServlet ์•ž๋‹จ์— Filter ํ˜•ํƒœ๋กœ ์œ„์น˜ํ•œ๋‹ค. Dispatcher๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ์ด Filter๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ, ํด๋ผ์ด์–ธํŠธ์˜ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ , ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์ฆ ์š”์ฒญ ํ™”๋ฉด์œผ๋กœ ์ž๋™ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค.


# Spring Security Filter

Filter์˜ ์ข…๋ฅ˜๋Š” ์ƒ๋‹นํžˆ ๋งŽ๋‹ค. ์œ„์—์„œ ์˜ˆ์‹œ๋กœ ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์„ ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•„ํ„ฐ๋Š” UsernamePasswordAuthenticationFilter๋‹ค.

์ธ์ฆ ๊ถŒํ•œ์ด ์—†์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ JSON์œผ๋กœ ๋‚ด๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ•„ํ„ฐ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.


API ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ ์ž‘์—… ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ํšŒ์› ๊ฐ€์ž…, ๋กœ๊ทธ์ธ API ๊ตฌํ˜„
  2. ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ROLE_USER ๊ถŒํ•œ์„ ๊ฐ€์ž… ํšŒ์›์—๊ฒŒ ๋ถ€์—ฌ
  3. Spring Security ์„ค์ •์—์„œ ROLE_USER ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ธํŒ…
  4. ๊ถŒํ•œ์ด ์žˆ๋Š” ํšŒ์›์ด ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ JWT ํ† ํฐ ๋ฐœ๊ธ‰
  5. ํ•ด๋‹น ํšŒ์›์€ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ API ์ ‘๊ทผ ์‹œ JWT ๋ณด์•ˆ ํ† ํฐ์„ ์‚ฌ์šฉ

์ด์ฒ˜๋Ÿผ ์ ‘๊ทผ ์ œํ•œ์ด ํ•„์š”ํ•œ API์—๋Š” ๋ณด์•ˆ ํ† ํฐ์„ ํ†ตํ•ด์„œ ์ด ์œ ์ €๊ฐ€ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ Spring Security๋ฅผ ํ†ตํ•ด ์ฒดํฌํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


# Spring Security Configuration

์„œ๋ฒ„์— ๋ณด์•ˆ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Configuration์„ ๋งŒ๋“ ๋‹ค. ๊ธฐ์กด ์˜ˆ์‹œ์ฒ˜๋Ÿผ, USER์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…๋„ ์—ฌ๊ธฐ์„œ ์ง„ํ–‰๋œ๋‹ค.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .httpBasic().disable() // rest api ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ์„ค์ • ์‚ฌ์šฉ์•ˆํ•จ. ๊ธฐ๋ณธ์„ค์ •์€ ๋น„์ธ์ฆ์‹œ ๋กœ๊ทธ์ธํผ ํ™”๋ฉด์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
                .cors().configurationSource(corsConfigurationSource())
                .and()
                .csrf().disable() // rest api์ด๋ฏ€๋กœ csrf ๋ณด์•ˆ์ด ํ•„์š”์—†์œผ๋ฏ€๋กœ disable์ฒ˜๋ฆฌ.
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // jwt token์œผ๋กœ ์ธ์ฆํ•˜๋ฏ€๋กœ ์„ธ์…˜์€ ํ•„์š”์—†์œผ๋ฏ€๋กœ ์ƒ์„ฑ์•ˆํ•จ.
                .and()
                .authorizeRequests() // ๋‹ค์Œ ๋ฆฌํ€˜์ŠคํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ๊ถŒํ•œ ์ฒดํฌ
                .antMatchers("/*/signin", "/*/signin/**", "/*/signup", "/*/signup/**", "/social/**").permitAll() // ๊ฐ€์ž… ๋ฐ ์ธ์ฆ ์ฃผ์†Œ๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ๊ฐ€๋Šฅ
                .antMatchers(HttpMethod.GET, "home/**").permitAll() // home์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” GET์š”์ฒญ ๋ฆฌ์†Œ์Šค๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ๊ฐ€๋Šฅ
                .anyRequest().hasRole("USER") // ๊ทธ์™ธ ๋‚˜๋จธ์ง€ ์š”์ฒญ์€ ๋ชจ๋‘ ์ธ์ฆ๋œ ํšŒ์›๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
                .and()
                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class); // jwt token ํ•„ํ„ฐ๋ฅผ id/password ์ธ์ฆ ํ•„ํ„ฐ ์ „์— ๋„ฃ๋Š”๋‹ค

    }


# [์ฐธ๊ณ  ์ž๋ฃŒ]

์ตœ์ข… ์ˆ˜์ • : 12/17/2022, 7:23:59 AM