<CodeStates> Spring Security

한주영·2023년 5월 16일
0

코드스테이츠 학습

목록 보기
23/24

Spring Security

Spring MVC의 인증(Authentication)과 인가(Authorization) 기능을 지원하는 보안 프레임워크
Spring MVC기반 애플리케이션에 보안을 적용한 표준

Principal(주체)
애플리케이션에서 작업을 수행할수있는 사용자, 디바이스 또는 시스템등이
될수있다, 일반적으로 인증프로세스가 성공적으로 수행된
사용자의 계정정보를 의미

Authentication(인증)

사용자가 본인이 맞음을 증명하는 절차

Authorization(인가 또는 권한 부여)

인증이 수행된 사용자에게 하나이상의 권한을 부여하여 특정 애플리케이션의
특정 리소스에 접근할수있게 허가하는 과정을의미

Spring Security의 구조

SSR(Server Side Rendering)방식의 애플리케이션
타임리프 템플릿 엔진 사용

Spring Security Configuration 적용

package com.codestates.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfiguration {
    // 여기에 Spring Security의 설정을 진행
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         http
            .csrf().disable()
            .formLogin()
            .loginPage("/auths/login-form")
            .loginProcessingUrl("/process_login")
            .failureUrl("/auths/login-form?error")
            .and()
            .exceptionHandling().accessDeniedPage("/auths/access-denied")   // (1)
            .and()
            .authorizeHttpRequests(authorize -> authorize                  // (2)
                    .antMatchers("/orders/**").hasRole("ADMIN")        // (2-1)
                    .antMatchers("/members/my-page").hasRole("USER")   // (2-2)
                    .antMatchers("⁄**").permitAll()                    // (2-3)
            );
        return http.build();
    }
}

해당 클래스에 Spring Security에서 지원하는 인증,권한부여를 설정

스프링 시큐리티 설정 관련 메소드

csrf 공격에대한 설정을 비활성화하는 csrf.disable()
폼 로그인 방식으로 지정하는 formLogin()
핸들러메서드에 요청URL을 보내는 loginPage()
로그인 인증요청을 수행할 URL을 지정하는 loginProcessingUrl()

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"> <!-- (1) -->
    <body>
        <div align="right" th:fragment="header">
            <a href="/members/register" class="text-decoration-none">회원가입</a> |
            <span sec:authorize="isAuthenticated()"> <!-- (2) -->
                <span sec:authorize="hasRole('USER')">  <!-- (3) -->
                    <a href="/members/my-page" class="text-decoration-none">마이페이지</a> |
                </span>
                <a href="/logout" class="text-decoration-none">로그아웃</a>  <!-- (4) -->
                <span th:text="${#authentication.name}">홍길동</span><!-- (5) -->
            </span><span sec:authorize="!isAuthenticated()"> <!-- (6) -->
                <a href="/auths/login-form" class="text-decoration-none">로그인</a>
            </span>
        </div>
    </body>
</html>            

로그아웃 처리까지 되어있는 커스텀 로그인 페이지 html

타임리프 기반의 HTML템플릿에서 사용자의 인증정보나 권한 정보를 이용해
어떤 로직을 처리하기위해서는 sec태그를 사용하기위한 XML네임스페이스 지정을 해야한다.

구체적인 인증,인가 처리에대한 포스팅은
다음포스팅에서 하도록 하겠다!

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글