본문 바로가기
Framekwork/photogram

[스프링 부트 포토그램] 17강 인증 회원가입 - CSFR 토큰 해제

by 아이엠제니 2024. 8. 26.


IDE: IntetlliJ Ultimate
Spring Boot: 3.3.0
JDK: 17

 


 

 

 

01. Whitelabel Error Page


 

CSRF Token 때문에 Whitelabel Error Page가 뜨는 것이라고 함.

 

 

 

02. CSRF Token


  • Cross-Site Request Forgery (CSFR) 공격을 방지하기 위해 사용되는 보안 토큰임
  • CSRF 공격은 사용자가 의도하지 않은 요청을 특정 웹 애플리케이션에 전송하도록 하는 공격
  • 이를 통해 공격자는 사용자의 권한을 도용하여 악의적인 행동을 수행할 수 있음

 

 

 

03. CSFR 토큰 해제


💾 SecuritConfig.java

package org.example.photogram_re.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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration // IoC
@EnableWebSecurity // 해당 파일로 시큐리티 활성화
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests((authorizeRequests) -> // 인증, 인가 설정
                        authorizeRequests
                                .requestMatchers("/", "/user/**", "/image/**", "/subscribe/**", "/comment/**", "/api/**").authenticated()
                                .anyRequest().permitAll()
                )
                .formLogin((formLogin) -> // 폼 기반 로그인 설정
                        formLogin
                                .loginPage("/auth/signin") // get
                                .loginProcessingUrl("/auth/signin") // post -> 스프링 시큐리티가 로그인 프로세스 진행
                                .defaultSuccessUrl("/")
                )
                .csrf((csrfConfig) -> // csrf 비활성화
                        csrfConfig.disable()
                )
                .build();
    }
}
  • `csrfConfig.disable()`: CSFR 보호를 비활성화함
    • CSRF 공격을 방지하기 위한 설정임
    • 개발이나 테스트 환경에서는 비활성화할 수 있지만, 운영 환경에서는 활성화하는 것이 보안상 안전함
    • 테스트 중이라서 비활성화함

 

 

💾 auth/signup.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>page</title>
    <link rel="stylesheet" th:href="@{/css/style.css}">
    <link rel="stylesheet" th:href="@{https://pro.fontawesome.com/releases/v5.10.0/css/all.css}"
          integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p" crossorigin="anonymous" />
</head>

<body>
<div class="container">
    <main class="loginMain">
        <!--회원가입섹션-->
        <section class="login">
            <article class="login__form__container">

                <!--회원가입 폼-->
                <div class="login__form">
                    <!--로고-->
                    <h1><img th:src="@{/images/logo.jpg}" alt=""></h1>
                    <!--로고end-->

                    <!--회원가입 인풋-->
                    <form class="login__input" th:action="@{/auth/signup}" method="post">
                        <input type="text" name="username" placeholder="유저네임" required="required"/>
                        <input type="password" name="password" placeholder="패스워드" required="required"/>
                        <input type="email" name="email" placeholder="이메일" required="required"/>
                        <input type="text" name="name" placeholder="이름" required="required"/>
                        <button>가입</button>
                    </form>
                    <!--회원가입 인풋end-->
                </div>
                <!--회원가입 폼end-->

                <!--계정이 있으신가요?-->
                <div class="login__register">
                    <span>계정이 있으신가요?</span>
                    <a th:href="@{/auth/signin}">로그인</a>
                </div>
                <!--계정이 있으신가요?end-->

            </article>
        </section>
    </main>
</div>
</body>

 

 

 

 

 

이지업클래스 [메타코딩] 스프링부트 SNS프로젝트 - 포토그램 만들기 강의 실습

참고
OpenAi. (2024) ChatGPT (version 3.5)[Large Language model]. https://chat.openai.com

 

 

 

 

 

300x250