[Spring Boot] 커스텀 로그인 페이지

Coco Park·2024년 1월 10일
0

Spring_Boot

목록 보기
4/13

Spring Security는 기본적으로 로그인 페이지를 제공하나, 직접 로그인 페이지를 만들어 사용하고자 하는 경우에 대해서 알아보고자 한다.

1. formLogin

먼저, formLogin 방식을 활용할 수 있는데 이는 미리 만들어 둔 페이지를 가지고 로그인을 진행하는 방식이다.

<!--login.mustache-->
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    Login Page
    <hr>
    <form action="/loginProc" method="post" name="loginForm">
        <input id="username" type="text" name="username" placeholder="id"/>
        <input id="password" type="password" name="password" placeholder="password"/>

        <!--csrf enable을 위해 token을 받아서 서버측으로 다시 전송하는 요소가 필요함-->
        <input type="hidden" name="_csrf" value="{{_csrf.token}}"/>

        <input type="submit" value="login"/>
    </form>
</body>
</html>

/login URL로 접근하면 SecurityConfig에 지정된 페이지에서 지정된 로그인메소드에 의해 로그인을 진행하고 성공했을 경우의 URL까지 지정하여 로그인 이후의 절차까지 밟을 수 있다.

http
                .formLogin((auth) -> auth.loginPage("/login")
                						 // 해당 페이지에서 로그인
                        .loginProcessingUrl("/loginProc")
                       	// 해당 URL을 거쳐서 로그인을 진행함 이는 login.mustache에 명시된 form의 action을 따름
                        .permitAll().defaultSuccessUrl("/"));
                        // 권한은 전체로 설정하고, 로그인 성공 시의 URL도 지정해줌

2. Http Basic 방식

Http 팝업을 통해 진행하는 방식이다. 더 엄격하게 관리되어야하는 서버에서 진행하며, 아이디와 비밀번호를 BASE64 방식으로 암호화함.

cf. BASE64 방식 : 입력된 바이트 스트림을 ASCII CODE로 변환하는 방식

http
                .httpBasic(Customizer.withDefaults());

다음과 같은 팝업창을 띄워줌

3. InMemory방식

해당 방식은 지정된 ID/PW의 유저들만 접속이 가능하며 해당 유저들은 삭제하거나 수정할 수 없고, 새로운 유저의 가입도 불가능하다.

이는 다음과 같이 구현할 수 있다.

@Bean
    public UserDetailsService userDetailsService() {

        UserDetails user1 = User.builder()
                .username("user1")
               .password(bCryptPasswordEncoder().encode("1234"))
                .roles("ADMIN")
                .build();

        UserDetails user2 = User.builder()
                .username("user2")
              .password(bCryptPasswordEncoder().encode("1234"))
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user1, user2);
    }
profile
ヽ(≧□≦)ノ

0개의 댓글