본문 바로가기
Spring/SpringBoot

[SpringBoot] Spring Security를 이용하여 인증/인가 처리하기 (1) - 개념 및 기본 설정

by J4J 2024. 2. 13.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 spring security를 이용하여 인증/인가 처리하기 첫 번째인 개념 및 기본 설정에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

들어가기에 앞서

 

해당 글에서 사용되는 spring boot 버전은 다음과 같습니다.

 

  • boot → 3.2.2
  • java → 17

 

 

반응형

 

 

인증이란?

 

spring security에 대해 알기 전 가장 먼저 인증에 대한 개념을 알고 있어야 합니다.

 

인증이라고 하는 것은 서비스에 접근할 수 있는 사용자가 맞는지를 확인하는 과정입니다.

 

예를 들어, 학생이 학교 내부에 들어가는 것을 얘기해 볼 수 있습니다.

 

학교를 다니는 학생으로 등록되어 있기 때문에 학교 내부에 들어갈 수 있지만, 학생으로 등록되어 있지 않은 사람이 학교 내부로 들어갈 수는 없습니다.

 

그러므로 인증된 사용자라는 것은 서버 내부에 등록되어 있기 때문에 서비스에 접근할 수 있는 사용자라고 얘기할 수 있습니다.

 

 

 

 

인가란?

 

인가라고 하는 것은 인증이 이루어진 사용자들 중 특정 서비스 기능을 사용할 수 있는 권한이 있는 사용자가 맞는지 확인하는 과정입니다.

 

인가도 학교와 관련된 예시를 얘기를 해볼 수 있습니다.

 

학생이 학교 내부에 들어갈 수 있지만 교장실이나 음식 조리실에 들어가려고 할 경우 누군가가 접근을 막으려고 할 겁니다.

 

왜냐하면 학생은 교장실과 음식 조리실에 들어갈 수 있는 권한이 없기 때문입니다.

 

 

 

 

교장실을 출입할 권한이 있는 사람은 교장 선생님이 될 것이고, 음식 조리실에 출입할 권한이 있는 사람은 영양사나 조리사 등이 될 것입니다.

 

즉, 학생 / 교장 선생님 / 조리사 등은 모두 학교를 출입할 수 있는 인증된 사용자 이지만 각자의 역할에 따라 특정 장소에 들어갈 수 있는 권한이 나뉘어 있습니다.

 

이처럼 서비스 내부에서도 특정 기능들을 사용할 수 있는 권한을 가지고 있는지 확인하는 과정을 인가라고 할 수 있습니다.

 

 

 

 

Spring Security란?

 

spring security는 자바 기반으로 이루어진 프레임워크 중 하나로 사용자 인증/인가 및 보안 관련 설정을 하는데 사용될 수 있습니다.

 

여기서 오해할 수 있는 부분 중 하나는 spring security를 사용해야만 spring에서 인증/인가 등의 기능을 제공해 줄 수 있는 것은 아닙니다.

 

spring security가 없더라도 인증/인가 및 보안 관련 설정들을 하는데 전혀 문제되지는 않지만 security를 사용하게 되면 security에서 제공해 주는 여러 가지 인증/인가 및 보안 관련 설정을 하는데 도움을 줄 수 있는 기능들을 활용해 볼 수 있습니다.

 

 

 

 

Spring Security를 이용한 인증 처리

 

spring security를 이용하여 인증 처리를 할 때 사용되는 대표적인 방법은 2가지로 session과 token이 있습니다.

 

먼저 session은 옛날부터 많이 사용되던 방법으로 사용자의 인증 정보를 spring 서버 내부에 보관하고 있는 방식입니다.

 

현재도 session을 사용하는데 문제가 되지 않은 서비스들이 많이 존재하겠지만 서버 내부에 사용자 정보를 보관하는 방식은 분산 처리가 많이 발생되는 서비스에는 서버에 부하를 가져올 수 있습니다.

 

 

 

그래서 최근에는 많은 분들이 token을 사용하고 있습니다.

 

token을 사용하게 되면 spring 서버에서는 token을 복호화하여 서버에서 인증한 사용자인지만 확인해주면 됩니다.

 

그리고 사용자 정보는 일반적으로 token 내부에 암호화되어 client에서 보관하고 있기 때문에 서버에 부담을 주지 않지만 token의 크기가 session id에 비해 크다는 것과 보안에 더 취약하다는 단점을 가지고 있습니다.

 

 

 

이런 장/단점들을 session과 token에서 확인할 수 있고 spring security와 무엇을 함께 사용해야 할지는 프로젝트의 상황에 맞춰서 적용해 볼 수 있습니다.

 

session과 token을 이용하여 spring security를 사용하는 방법에 대해서는 다음 글에서 순서대로 작성해보도록 하겠습니다.

 

 

 

 

Spring Security를 이용한 인가 처리

 

spring security를 이용한 인가 처리는 filter를 활용합니다.

 

먼저 security를 사용하기 위한 설정을 진행할 때 filter에 권한 별로 사용할 수 있는 기능에 대한 정의를 하게 됩니다.

 

그리고 session 및 token을 이용하여 인증된 사용자가 가지고 있는 권한 정보들을 filter에 정의되어 있는 설정과 비교하여 인가 처리를 수행합니다.

 

그래서 security를 사용하게 되면 다음과 같은 구조로 요청이 처리되는 spring은 인증되지 않은 사용자의 요청에 대해서는filter 이후 과정으로 넘기지 않습니다.

 

spring request 처리 과정

 

 

 

 

Spring Security 용어 정리

 

spring security를 사용하게 되면 알아야 하는 용어들이 여러 가지가 있습니다.

 

많은 용어들이 있지만 자주 사용되는 용어들만 다음과 같이 간단하게 정리해볼 수 있습니다.

 

  • AuthenticationFilter → spring security에 설정된 값을 이용한 filter 처리가 이루어지는 곳
  • Principal → 인증된 사용자
  • Crendentials → 사용자의 자격 증명 (= 비밀번호)
  • Authorities → 사용자가 소유하고 있는 권한 정보들
  • Authentication → Principal / Credentials / Authorities를 담고 있는 인증 객체
  • SecurityContext → Authentication 정보를 실질적으로 보관하고 있는 장소
  • SecurityContextHolder → SecurityContext를 관리

 

 

 

 

Spring Security 기본 설정

 

이번엔 spring security의 기본적인 설정들을 해보겠습니다.

 

security는 초기 설정을 하게 될 경우 로그인 페이지를 자동으로 제공해주고 있습니다.

 

로그인 페이지를 제외하고는 thymeleaf를 활용하여 인증/인가 처리된 사용자만 접근할 수 있는 MVC 구조의 간단한 코드를 작성해 보겠습니다.

 

 

 

 

[ 1. dependency 추가 ]

 

// build.gradle
dependencies {
    // spring security
    implementation 'org.springframework.boot:spring-boot-starter-security'
    // thymeleaf
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

 

 

 

[ 2. spring security 설정 클래스 추가 ]

 

package com.jforj.springsecuritybase.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .httpBasic(Customizer.withDefaults()) // 기본적인 security 설정 적용
                .csrf(AbstractHttpConfigurer::disable) // csrf 설정은 사용하지 않음
                .sessionManagement(Customizer.withDefaults()) // 기본적인 session 관리 설정 적용
                .authorizeHttpRequests(
                        authorizeHttpRequests ->
                                authorizeHttpRequests
                                        .anyRequest().authenticated() // 모든 요청에 대해서 인증된 사용자만 접근 가능
                )
                .formLogin(
                        formLogin ->
                                formLogin
                                        .successHandler(
                                                (request, response, authentication) -> {
                                                    response.sendRedirect("/home"); // 로그인이 성공하면 /home으로 이동
                                                }
                                        )
                                        .permitAll() // 로그인 페이지는 모든 사용자에게 허용
                )
        ;

        return httpSecurity.build();
    }
}

 

 

 

 

[ 3. thymeleaf 설정을 통한 /home 페이지 추가 ]

 

// controller
package com.jforj.springsecuritybase.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/home")
    public String home() {
        return "home";
    }
}



// main/resources/templates/home.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <div>
        <h2>Check Home Page After Login</h2>
    </div>
</body>
</html>

 

 

 

 

기본 설정 테스트

 

위와 같이 설정을 마쳤다면 서버를 구동해 보겠습니다.

 

서버가 정상적으로 실행될 경우 다음과 같이 콘솔 창에 security password가 보이는 것을 확인할 수 있습니다.

 

security password 콘솔 출력

 

 

 

해당 정보는 spring security에서 기본적으로 제공해 주는 로그인 창에서 활용 가능한 비밀번호 값으로 아이디는 "user" 비밀번호는 콘솔 창에 출력된 비밀번호를 입력하여 로그인할 수 있습니다.

 

 

 

 

먼저 인증된 사용자만 접근할 수 있는 /home 경로에 접속해 보겠습니다.

 

서버가 8080 포트로 동작된 경우 http://localhost:8080/home에 접속해 보면 아직 인증된 사용자가 아니기 때문에 /home에 접속하지 못하고 spring security에서 기본적으로 제공해 주는 로그인 페이지인 http://localhost:8080/login로 redirect 되는 것을 확인할 수 있습니다.

 

해당 페이지에서 위에서 확인한 계정 정보를 다음과 같이 입력을 하여 로그인이 이루어졌다면 securityConfig에 설정한 대로 /home 경로로 redirect 되어야 정상 작동한 것입니다.

 

로그인 정보 입력

 

 

로그인 이후 redirect 페이지 확인

 

 

 

 

 

 

 

 

이상으로 spring security를 이용하여 인증/인가 처리하기 첫 번째인 개념 및 기본 설정에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글