전공영역 공부 기록

스프링시큐리티 1편 - 스프링부트 구조와 helloworld 실행

악분 2021. 8. 18. 11:24
반응형

 

1편은 스프링시큐리티 구조와 hello world프로젝트를 만드는 과정을 설명합니다.

 

▶ 유투브 영상(0:00 ~ 13:15): https://youtu.be/ewslpCROKXY

 

1. 스프링시큐리티 구현 원리

1.1 스프링시큐리티란?

스프링시큐리티는 스프링(부트)기반 애플리케이션의 보안 설정을 도와주는 라이브러리입니다. 스프링 애플리케이션 보안설정을 위해 사용해도 되고, 인증/인가 서버를 구축하고 싶으신 분들에게 사용을 추천합니다.

 

1.2 원리

스프링시큐리티는 서블릿(Servlet) 필터([그림1])로 동작합니다.  스프링시큐리티는 서블릿 필터 중 한개로 등록되어 보안설정을 수행합니다.

 

그림1 필터체인(참고: https://docs.spring.io/spring-security/site/docs/current/reference/html5/#prerequisites)

 

스프링시큐리티가 서블릿 필터로 동작하지만 실제 구현은 스프링(부트)에게 위임합니다. 스프링시큐리티가 스프링(부트)에게 구현한 자원을 보호하기 위해 Bean접근이 불가능하기 때문입니다.

스프링(부트)가 위임받아 스프링시큐리티 필터를 구현하는 인터페이스를 DelegatingFilterProxy라고 합니다.

그림2 스프링시큐리티 필터 등록과정 (https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-filterchainproxy)

 

 

SecurityFilterChain기능은 여러 개의 체인으로 구성되어 있습니다. SecurityFileterChain으로 관리되는 필터체인을 security filter라고 부릅니다. 각 필터는 인증/인가의 고유한 기능을 담당합니다. 예를 들어 로그인을 담당하는 필터, 세션을 관리하는 필터, 로그아웃을 담당하는 필터가 존재합니다.

그림3 securityfilterchain 내부동작 (https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-filterchainproxy)

 

 

2. 실습 준비

스프링시큐리티 실습하기 이전에 프로젝트 생성을 하겠습니다. 그리고 인증 테스트를 위한 helloworld API를 생성합니다.

 

2.1 프로젝트 생성

프로젝트 생성은 spring initalizr를 이용했습니다. 선택한 옵션은 maven, java 8버전, spring web과 lombok라이브러리를 추가했습니다.

그림4 스프링부트 프로젝트 설정

 

2.2 hello world API 추가

간단히 hello world 문자열을 리턴하는 API를 생성합니다.

@RestController
public class DemoController {

    @GetMapping("/")
    public String helloworld(){
        return "hello world";
    }
}

 

스프링부트 애플리케이션을 실행하고 "/"를 요청하면 hello world 응답을 받을 수 있습니다

그림5 helloworld 응답

 

3. 스프링시큐리티 라이브러리 추가

이제 API에 보안을 설정하기 위해 스프링시큐리티 라이브러리를 추가해보겠습니다.

 

저는 maven을 사용하므로 pom.xml dependency에 스프링시큐리티를 추가했습니다. 스프링시큐리티와 테스트용 스프링시큐리티를 추가해야합니다.

<dependencies>	
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

 

4. 기본 보안설정

스프링부트에서 스프링시큐리티 라이브러리를 사용하면 기본(default) 보안설정이 활성화됩니다.

  1. [그림2], [그림3]에서 설명한 springSecurityFilterChain이 자동으로 생성됩니다. (영상 https://youtu.be/ewslpCROKXY?t=547 참고)
  2. 로그인 페이지, 로그인/로그아웃 API가 자동으로 생성됩니다.
    • 로그인 페이지: HTTP GET /login
    • 로그인 API: HTTP POST /login
    • 로그아웃 API: HTTP POST /logout
  3. 기본 user계정이 생성되고, 애플리케이션 실행할 때마다 user계정 비밀번호를 초기화 합니다. 

 

스프링부트 애플리케이션을 실행하면 자동설정 로그와 로그인 비밀번호가 출력됩니다.

그림8 스프링부트 실행후 스프링시큐리티 로그 확인

 

[그림 5]에서 만든 helloworld api를 호출하면 로그인 페이지가 나옵니다. 아이디는 user, 비밀번호는 [그림 8]에서 확인한 비밀번호를 입력하면 됩니다.

그림9 로그인 페이지

 

5. 정리

정리하면 스프링시큐리티는 필터를 이용해서 인증/인가를 수행하는 라이브러리입니다. [그림 1 ~ 3]에서 설명했듯이 각 열할마다 필터들이 이미 구현되어 있습니다. 

반응형