스프링 시큐리티 정리하기(로그인)_P1

미나·2023년 11월 6일

새로알게된 정보

목록 보기
19/23
스프링 시큐리티 사용 배경 : 로그인정보를 섹션에 저장하기 위해서 일부분만 작성하면 적용이 가능한 스프링 시큐리티를 적용해보도록한다.
1. 스프링 시큐리티를 사용하기 위해 build.gradle에 파일을 추가하자.
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
2. 설치 후 로컬서버 재시작하면 로그인 화면이 나올 것이다.
package com.mysite.sbb;

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;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
                .requestMatchers(new AntPathRequestMatcher("/**")).permitAll()) 
        ;
        return http.build();
    }
}
다음 문장은 모든 인증되지 않은 요청을 허락한다는 의미이다. 따라서 로그인을 하지 않더라도 모든 페이지에 접근할 수 있다.
.formLogin((formLogin) -> formLogin  // 로그인URL등록,  
    .loginPage("/user/login") 
    .defaultSuccessUrl("/category"))  // 로그인 성공시 default페이지는 /category로 간다. 
3. SecurityConfig의 http안에 추가로 위의 소스를 넣는다. .formLogin 메서드는 스프링 시큐리티의 로그인 설정을 담당하는 부분이다.
public class UserController { 
    (... 생략 ...) 
    @GetMapping("/user/login")
    public String login() {
        return "mainlist";
    }
}
> 위에서 로그인 URL을 /user/login으로 설정했으므로 User컨트롤러에 해당 매핑을 추가한다.
> 나의 mainlist는 아래와 같다.
<!DOCTYPE html>
<html lang="en" layout:decorate="~{layout}">
<div layout:fragment="content-layout" class="content">
    <div class="hero bg-base-200">
        <img class="mainjpg" src="/travel-illustrations.jpg"/>
        <div class="hero-content flex-col lg:flex-row-reverse">
            <div class="text-center lg:text-left">
                <h1 class="text-5xl font-bold">Login now!</h1>
                <p class="py-6">Provident cupiditate voluptatem et in. Quaerat fugiat ut assumenda excepturi exercitationem quasi. In deleniti eaque aut repudiandae et a id nisi.</p>
            </div>
            <div class="card flex-shrink-0 w-full max-w-sm shadow-2xl bg-base-100">
                <form th:action="@{/user/login}" class="card-body" method="post" >
                    <div th:if="${param.error}">
                        <div class="alert alert-danger">
                            사용자ID 또는 비밀번호를 확인해 주세요.
                        </div>
                    </div>
                    <div class="form-control">
                        <label class="label">
                            <span class="label-text">Email</span>
                        </label>
                        <input style="width : 330px" type="email" placeholder="email" class="input input-bordered" name="username" required />
                    </div>
                    <div class="form-control">
                        <label class="label">
                            <span class="label-text">Password</span>
                        </label>
                        <input style="width : 330px" type="password" placeholder="password" name="password" class="input input-bordered" required />
                        <label class="label">
                            <a href="#" class="label-text-alt link link-hover">Forgot password?</a>
                        </label>
                    </div>
                    <div class="form-control mt-6"> 
                        <button class="btn btn-primary" type="submit" >Login</button>
                        <button class="btn btn-primary" onclick="doJoin(this.form)">Join</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <script> 
        function doJoin(form){
           form.action = "/user/signup";
           form.method = "get";
           form.submit();
        } 
    </script> 
</div>
</html>
아직 로그인을 수행할 수는 없다. 왜냐하면 스트링 시큐리티에 무엇을 기준으로 로그인을 해야하는지 설정하지않았기 때문이다. 나는 데이터베이스에 회원정보를 저장했기때문에 데이터베이스에서 회원정보를 조회하는 방법을 사용해보겠다.
package com.korea.test.user;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<SiteUser, Integer> { 
  Optional<SiteUser> findByEmail(String username);
}
| 출처 : 점프 투 스프링부트 |
  1. 시큐리티 감독 하에서 post 요청 보낼 때는 csrf 토큰을 같이 보내야함
    (th:action 쓰면 됨)

  2. 시큐리티는 비밀번호가 평문으로 들어
    오면 파업한다.(암호화 하면 됨)

  3. 시큐리티는 아이디를 username으로, 비밀번호를 password로 정해놨다.
    (임의로 정하면 안됨)

0개의 댓글