๐Ÿ“Œ Spring Security ๊ธฐ๋ณธ ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 4์›” 29์ผ

SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
30/36
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-04-29


๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

Spring Security๋ž€?

โœ… Spring Security๋Š” ์ธ์ฆ(Authentication) ๊ณผ ๊ถŒํ•œ(Authorization) ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ API์˜ ์ ‘๊ทผ ์ œ์–ด, ์„ธ์…˜ ๊ด€๋ฆฌ, CSRF, CORS, ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.


์ฃผ์š” ํŠน์ง•

  • ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ํ•„ํ„ฐ ์ฒด์ธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์„ธ์…˜ ๋ฐ JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹ ์ง€์›
  • ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ๋ฐฉ์‹ ์ง€์› (ํผ ๋กœ๊ทธ์ธ, ์†Œ์…œ ๋กœ๊ทธ์ธ, HTTP Basic ๋“ฑ)
  • ๋ฉ”์„œ๋“œ ์ˆ˜์ค€ ๋ณด์•ˆ ์ œ๊ณต (@Secured, @PreAuthorize ๋“ฑ)
  • ์œ ์—ฐํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ (ํ•„ํ„ฐ, ํ•ธ๋“ค๋Ÿฌ, ํ† ํฐ ์ฒ˜๋ฆฌ ๋“ฑ)

ํ™œ์šฉ ์˜ˆ์‹œ

  • ๋กœ๊ทธ์ธ ์ธ์ฆ ์ฒ˜๋ฆฌ
  • URL๋ณ„ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด
  • ์‚ฌ์šฉ์ž ์—ญํ•  ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ธฐ๋Šฅ ์ œํ•œ
  • REST API์— JWT ์ธ์ฆ ์ ์šฉ
  • ๊ด€๋ฆฌ์ž/์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ„๋ฆฌ

Spring Security ํ•„ํ„ฐ ์ฒด์ธ

โœ… Spring Security๋Š” ํ•„ํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฐธ๊ณ  ์ด๋ฏธ์ง€
https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdgw6Fx%2Fbtskgc8Usno%2FaIoVxWzjsvAJi4RYeEdBPK%2Fimg.png


์ธ์ฆ ์ฒ˜๋ฆฌ ํ๋ฆ„

โœ… ์ธ์ฆ ํ๋ฆ„ ์š”์•ฝ

์ฐธ๊ณ  ์ด๋ฏธ์ง€
https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQdplo%2Fbtsknv61uIC%2FXt0KpLXwwk3EQI7Uj9jsj1%2Fimg.png

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ โ†’ HttpServletRequest ์ „๋‹ฌ
  2. AuthenticationFilter๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰
  3. UsernamePasswordAuthenticationToken ๊ฐ์ฒด ์ƒ์„ฑ
  4. AuthenticationManager๋กœ ์ „๋‹ฌ
  5. AuthenticationProvider๋กœ ์ „๋‹ฌ
  6. UserDetailsService๊ฐ€ DB ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
  7. ์ž…๋ ฅ ์ •๋ณด์™€ DB ์ •๋ณด ๋น„๊ต
  8. ์ธ์ฆ ์™„๋ฃŒ โ†’ SecurityContextHolder์— ์ €์žฅ
  9. ์„ฑ๊ณต ์‹œ AuthenticationSuccessHandler, ์‹คํŒจ ์‹œ AuthenticationFailureHandler ์‹คํ–‰

pom.xml ์„ค์ •

โœ… Spring Security ์˜์กด์„ฑ ์ถ”๊ฐ€ (pom.xml)

<!-- CORE -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- WEB -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- CONFIG -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- TAGLIBS -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

web.xml ์„ค์ •

โœ… Spring Security ํ•„ํ„ฐ ๋“ฑ๋ก (web.xml)

<!-- SECURITY FILTER -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Java Config๋กœ ๋ณด์•ˆ ์„ค์ • (SecurityConfig ํด๋ž˜์Šค)

โœ… @EnableWebSecurity๋ฅผ ์ด์šฉํ•œ Java Config ์„ค์ •

package com.example.app.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity  // Spring Security ์„ค์ • ํ™œ์„ฑํ™”
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // ๊ถŒํ•œ ์ฒดํฌ
        http.authorizeRequests()
            .anyRequest().authenticated(); // ๋ชจ๋“  ์š”์ฒญ์€ ์ธ์ฆ ํ•„์š”

        // ๋กœ๊ทธ์ธ ์„ค์ •
        http.formLogin()
            .permitAll(); // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋Š” ๋ชจ๋‘ ์ ‘๊ทผ ํ—ˆ์šฉ

        // ๋กœ๊ทธ์•„์›ƒ ์„ค์ •
        http.logout()
            .permitAll(); // ๋กœ๊ทธ์•„์›ƒ๋„ ๋ชจ๋‘ ์ ‘๊ทผ ํ—ˆ์šฉ
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์‚ฌ์šฉ์ž ๊ณ„์ • ์ž„์‹œ ๋“ฑ๋ก
        auth.inMemoryAuthentication()
            .withUser("user")
            .password("{noop}1234") // {noop}: ์•”ํ˜ธํ™” ์—†์ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ
            .roles("USER"); // ROLE_USER๋กœ ์ž๋™ ์ ‘๋‘์‚ฌ ์ถ”๊ฐ€
    }
}

๐Ÿงน ์ตœ์ข… ์ •๋ฆฌ

โœ… Spring Security๋Š”

  • ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ตํ•œ ์ธ์ฆ/์ธ๊ฐ€ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • AuthenticationManager์™€ UserDetailsService๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฒ€์ฆํ•œ๋‹ค.
  • XML ์„ค์ • ๋Œ€์‹  Java Config๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹์€ ๋ณด์•ˆ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•™์Šต ์ดˆ๊ธฐ์—๋Š” inMemoryAuthentication()๋กœ ๊ฐ„๋‹จํ•œ ์ธ์ฆ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€