Spring Security 시작

Seunghyeon·2025년 3월 20일
0

Security

목록 보기
1/1

시큐리티 동작 과정

HTTP 요청이 서버로 들어가면

Servlet Container 안에 Dispatcher Servlet이 받게 되는데

이 전에 들어오는 요청들은 필터에 걸러진다.

Spring Security는 이 필터에서 들어오는 요청이

안전한 요청인지, 인가 있는 요청인지 확인한다.


build.gradle 에 시큐리티 의존성을 등록을 해두면

이 프로젝트에 뭐 따로 해주지 않아도 알아서 전체 프로젝트에 적용이 된다.

프로젝트를 시작하면 아래처럼 비밀번호 알려주고 로그인을 하게 만듦

초기 ID 는 user, PW 는 사진에 나오는 랜덤으로 생성된 문자열이다.

그러면 로그인은 어떻게 할 수 있나?

  1. 브라우저

    브라우저에서는 해당 서버의 주소로 들어가는데 경로는 /login 이다.

    로컬호스트에서 돌리는 경우는

    localhost:8080/api/login 이 되겠다. (context-path가 /api로 설정되어 있음)

    나는 컨트롤러에서 login을 매핑해주지 않았지만 시큐리티가 처음 설정되면 알아서 login 경로로 로그인할 수 있도록 만들어준다.

    • 접속 시 화면

  1. Postman

    Postman으로도 로그인할 수 있다.

    • 요청 시 설정

나는 현재 서버에 테스트용으로 `/auth/main` 을 매핑해둔 상태이다. 여기에 요청을 보내기 전에 Authorization 탭에서 ‘Basic Auth’로 선택후 Username, Password 입력해둔다. 

여기서 왜 admin에 admin 이냐면 내가 application.yml 에 따로 설정해두었기 때문

```yaml
security:
  user:
    name: admin
    password: admin
```

Security Config

이 클래스를 만들어서 내가 원하는 곳에만 인증이 필요하도록 설정할 수 있다.

얘가 없으면 기본적으로 모든 요청은 인가작업이 필요하도록 설정되어있다.

우선 config 디렉토리에

SecurityConfig 클래스 만들어주고

@Configuration@EnableWebSecurity 를 붙여준다.

  1. @Configuration

해당 클래스는 스프링 앱에서 사용하는 설정파일입니다.

라고 선언해주는 기능이다.

  1. @EnableWebSecurity

해당 클래스가 Security 설정을 해주는 클래스입니다.

라고 선언해주는것이다. 즉 Spring Security 설정파일로 만드는 어노테이션임

그런데 @EnableWebSecurity 안에는 @Configuration 이 포함되어 있다. (파고파고 들어가면 나옴)

근데 왜 또 붙이는거지?

→ 해당 클래스가 설정파일임을 알리기 위한 ‘관례’ 라고 한다.

그러니까 @Configuration 어노테이션이 붙어있으면 ‘일단 얘는 설정파일이다.’ 라고 개발자들에게 알려주는거다.


우리는

어떤 페이지는 로그인 안해도, 어떤페이지는 로그인 해야 볼 수 있게

‘커스텀 거름망’을 만드려면 SecurityFilterChain 이라는 것을 으로 등록해둬야 한다.


Spring Security는 ‘보안 필터 체인’ 이라는 것을 만들어야 한다.

*보안 필터 체인(Security Filter Chain)이란?

HTTP 요청이 들어오면 필터에 걸러져서 들어온다고 했다.

그 필터를 사슬처럼 엮어둔 것을 필터체인이라고 하고

이걸 Spring Security가 만들어준다.

근데 Security Config는 @Configuration이기 때문에 앱 시작 전 설정을 해 주는 클래스다.

그러면서 Security에 대한 설정을 만드는데 필요한 것이 SecurityFilterChain

그러기 위해서는 필터체인을 설정하는 해당 객체가 빈으로 등록되어 있어야 한다.


일단 간단하게 아래와 같이 SecurityFilterChian을 만들어봤다.

우리는 ‘커스텀 거름망’을 사용할 것이기 때문에

HttpSecurity 를 받아서 설정해주고 다시 리턴해주면 된다.

(return에 보면 build로 되어있다. SecurityFilterChain은 Builder 패턴을 사용하고 있음.)


대충 보면 requestMatchers랑 뒤에 뭐 붙어있는 형식이다.

  1. requestMatchers 에는 적용할 context를 설정해줄 수 있다.

  2. 그리고 그 뒤에는 접근 가능한 대상을 설정해주고 있다. (permitAll = 누구에게나 개방)

  3. .anyRequest는? if else 문에서 else와 같다.

상당히 간단한 구조로 보인다.

  • 이렇게 설정하면 /auth/main에 들어갈 수 있을까? → ( X )

안된다. /auth 안에 모든 경로에 접근가능하게 하려면 상대경로의 느낌으로 /* 을 붙여야 한다.

기본적인 Spring SecurityFilterChain 을 한번 만들어 봤다.

profile
그냥 합니다.

0개의 댓글