
서비스를 개발할때 우리가 만드는 Backend서버의 리소스에 모든사람이 제한없이 접근하게 된다면 원치않은 정보가 원치않은 유저에게 전달될 위험이 있습니다.
이를 방지하기 위해 많은 방법이 연구되어지고 있지만, 스프링부트를 사용한 서비스개발에 가장 유명한 방법은 스프링 시큐리티가 아닐까 싶다.
스프링 시큐리티는 개념적으로 인증(Authentication)과 인가(Authorize)로 나뉘어집니다.
인증(Authentication)은 리소스접근을 요청한 주체가 누구인지 확인하는 과정입니다.
인가(Authorize)는 요청된 리소스에 인증(Authentication)이 끝난 주체가 접근이 가능한지 확인하는 과정입니다.

이런 형태의 시큐리티를 구현하기 위해 아래와 같은 Configration을 통해 접근을 제한할 수 있습니다.
이번 블로그에서는 가장 간단하고 심플한 방식으로 접근허가와 접근제한을 알아보겠습니다.
예시는 InteliiJ / Gradle / Java 18 / 스프링부트 3.0 / 스프링 6.0 을 사용했습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "bb";
}
}
위의 소스를 @SpringBootApplication가 있는 클래스가 속한 패키지의 하위패키지 어딘가에 생성합니다. (xml로 설정하던 스프링과는 달리 스프링부트는 기본적으로 Component Scan위치가 이 위치로 지정되어 있습니다.)
이 상태로 서버를 실행시키고 http://localhost:8080/test 로 접근해보겠습니다.

낯선 화면이 우리를 반겨줍니다.
이 화면은 스프링시큐리티에서 기본적으로 제공하는 로그인화면입니다. 스프링시큐리티의 의존성을 추가하는것만으로도 모든 요청은 인증이 필요하게 됩니다.
하지만 우리는 아무런 설정을 하지 않기 때문에, 스프링 시큐리티는 로그인이 가능한 Username과 password를 제공합니다.

Using generated security password: acfd4b80-3173-4ff6-8cdc-fc1dde11ee1b
This generated password is for development use only. Your security configuration must be updated before running your application in production.
위와 같은 로그가 떠있습니다. 이 뜻은 개발목적의 사용으로만 제공되는 비밀번호이며, 서비스의 시큐리티 설정을 반드시 해야만 한다는 뜻입니다.
자 그럼 저 비밀번호를 통해 우리가 만든 TestController로 접근해보겠습니다.

Username은 user가 기본이고, password는 서버실행시 랜덤으로 제공되는 저 UUID를 입력해주겠습니다.

요청에 대한 응답이 성공적으로 온것을 확인할 수 있습니다.
추가적으로 임시적인 패스워드지만 서버실행시마다 바뀌기 때문에 이를 고정하고 싶으신 분들은 application.yml에 유저아이디/비밀번호를 설정해 줄 수 있습니다.
spring:
security:
user:
name: puer
password: password
이와 같이 설정해 준다면 설정한 유저정보로 모든 요청에 접근이 가능합니다.
오늘은 여기까지 하고, 다음 블로그에서는 접근제한에 대해서 알아보겠습니다. 감사합니다.