๐Ÿ”ฅ #10 ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๋กœ๊ทธ์ธ ์ง„ํ–‰

myeonjiยท2022๋…„ 2์›” 21์ผ
0

๐Ÿ”ฅ #8 ์— ์ด์–ด์„œ ์ง„ํ–‰~!

UserApiController๋ฅผ ๋ณด๋ฉด, /auth/loginProc๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค.
์™œ๋ƒํ•˜๋ฉด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๊ฐ€๋กœ์ฑ„๋„๋ก ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฐ€๋กœ์ฑ„๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SecurityConfig ์˜ configure ๋ฉ”์†Œ๋“œ์—์„œ .loginProcessingUrl("/auth/loginProc") ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ํ˜„์žฌ SecurityConfig๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

< SecurityConfig >

@Configuration // ๋นˆ ๋“ฑ๋ก (IoC๊ด€๋ฆฌ)
@EnableWebSecurity // Security ํ•„ํ„ฐ๊ฐ€ ๋“ฑ๋ก๋จ = ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ด๋ฏธ ํ™œ์„ฑํ™”๋Š” ๋˜์–ด์žˆ์ง€๋งŒ, ์„ค์ •์€ ํ•ด๋‹น ํŒŒ์ผ์—์„œ ํ•  ๊ฒƒ์ž„
@EnableGlobalMethodSecurity(prePostEnabled = true) // ํŠน์ • ์ฃผ์†Œ๋กœ ์ ‘๊ทผ์„ ํ•˜๋ฉด ๊ถŒํ•œ ๋ฐ ์ธ์ฆ์„ ๋ฏธ๋ฆฌ ์ฒดํฌ (์ˆ˜ํ–‰ํ•œ ํ›„์— ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 1. Bean ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ฉ”์„œ๋“œ์— ๋ถ™์—ฌ์„œ ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ
    @Bean // IoC๊ฐ€ ๋œ๋‹ค.
    public BCryptPasswordEncoder encodePWD() {
        return new BCryptPasswordEncoder(); // ์ด ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๊ฒŒ ๋จ. ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์ ธ๊ฐ€์„œ ์“ฐ๋ฉด ๋œ๋‹ค.
    }

    // ํ•„ํ„ฐ๋ง
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable() // csrf ํ† ํฐ ๋น„ํ™œ์„ฑํ™” (ํ…Œ์ŠคํŠธ์‹œ ๊ฑธ์–ด๋‘๋Š”๊ฒŒ ์ข‹์Œ)
                .authorizeRequests() // request๊ฐ€ ๋“ค์–ด์˜ค๋ฉด
                .antMatchers("/", "/auth/**", "/js/**", "/css/**", "/image/**") // ์—ฌ๊ธฐ๋กœ ๋“ค์–ด์˜ค๋ฉด
                .permitAll() // ๋ชจ๋‘ ๊ฐ€๋Šฅ (๋ˆ„๊ตฌ๋‚˜ ๊ฐ€๋Šฅ)
                .anyRequest() // ๊ทธ๊ฒŒ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์ฒญ์€
                .authenticated() // ์ธ์ฆ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค
                .and()
                .formLogin()
                .loginPage("/auth/loginForm") // ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ์€ ์ด ๋กœ๊ทธ์ธ ํผ์œผ๋กœ ์˜จ๋‹ค
                .loginProcessingUrl("/auth/loginProc") // ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์š”์ฒญ์ด ์˜ค๋Š” ๋กœ๊ทธ์ธ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋Œ€์‹  ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.
                .defaultSuccessUrl("/"); // ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด "/"๋กœ ๊ฐ„๋‹ค.
//                .failureUrl("/fail"); // ์‹คํŒจ์‹œ url
    }

    // ์ฐธ๊ณ  : .headers().frameOptions().disable() // ์•„์ดํ”„๋ ˆ์ž„ ์ ‘๊ทผ ๋ง‰๊ธฐ
    // ์ฐธ๊ณ  : .csrf().disable() // csrf ํ† ํฐ ๋น„ํ™œ์„ฑํ™” (ํ…Œ์ŠคํŠธ์‹œ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ)
}

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ username๊ณผ password๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๋Š”๋ฐ,
UserDetails ํƒ€์ž…์˜ User ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๊ณ  ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ธ์…˜์— ์œ ์ € ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•˜๋Š”๋ฐ User ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๊ณ , UserDetails ํƒ€์ž…๋งŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

< PrincipalDetail >

// ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๊ณ  ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด,
// UserDetails ํƒ€์ž…์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๊ณ ์œ ํ•œ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.
public class PrincipalDetail implements UserDetails {
    private User user; // ์ฝคํฌ์ง€์…˜ (๊ฐ์ฒด๋ฅผ ํ’ˆ๊ณ  ์žˆ๋Š” ๊ฒƒ)

    public PrincipalDetail(User user) {
        this.user = user;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    // ๊ณ„์ •์ด ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๋ฆฌํ„ดํ•œ๋‹ค. (true : ๋งŒ๋ฃŒ ์•ˆ๋จ)
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    // ๊ณ„์ •์ด ์ž ๊ฒจ์žˆ๋Š”์ง€ ์•ˆ ์ž ๊ฒจ์žˆ๋Š”์ง€ ๋ฆฌํ„ดํ•œ๋‹ค. (true : ์ž ๊ธฐ์ง€ ์•Š์Œ)
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    // ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. (true : ๋งŒ๋ฃŒ ์•ˆ๋จ)
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    // ๊ณ„์ •์ด ํ™œ์„ฑํ™”(์‚ฌ์šฉ๊ฐ€๋Šฅ)์ธ์ง€ ๋ฆฌํ„ดํ•œ๋‹ค. (true : ํ™œ์„ฑํ™”)
    @Override
    public boolean isEnabled() {
        return true;
    }

    // ๊ณ„์ •์ด ๊ฐ–๊ณ ์žˆ๋Š” ๊ถŒํ•œ ๋ชฉ๋ก์„ ๋ฆฌํ„ดํ•œ๋‹ค. (๊ถŒํ•œ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์„œ ๋ฃจํ”„๋ฅผ ๋Œ์•„์•ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ๋Š” ํ•˜๋‚˜๋งŒ)
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        Collection<GrantedAuthority> collectors = new ArrayList<>(); // ArrayList๋Š” Collection ํƒ€์ž…์ด๋‹ค. (์ƒ์†)

//        collectors.add(new GrantedAuthority() {
//
//            @Override
//            public String getAuthority() {
//                return "ROLE_"+user.getRole(); // role ์„ ๋ฐ›์„ ๋•Œ ์•ž์— "ROLE_" ๋ถ™์ด๋Š” ๊ฒƒ(prefix)์ด ์Šคํ”„๋ง์˜ ๊ทœ์น™, ์ฆ‰ ROLE_USER ๊ฐ™์€ ์‹์œผ๋กœ ๋ฆฌํ„ด๋จ
//            }
//        });

        collectors.add(()->{return "ROLE_"+ user.getRole();}); // ์–ด์ฐจํ”ผ add ์•ˆ์— ๋“ค์–ด๊ฐˆ ํ•จ์ˆ˜๋Š” GrantedAuthority() ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค์‹์œผ๋กœ ๊ฐ€๋Šฅ

        return collectors;
    }

}

์„ธ์…˜์— PrincipalDetail๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๋•Œ ์šฐ๋ฆฌ๊ฐ€ DB์— ์ €์žฅํ•˜๋Š” User ๊ฐ์ฒด๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ์ง€์…˜ ํ•œ๋‹ค.

ํƒ€์ž…์€ UserDetails ์ด์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— implements๋ฅผ ํ•œ๋‹ค.
UserDetails๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋“ค์„ ์ „๋ถ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ๋‹ค.

  • ์ปดํฌ์ง€์…˜ ๊ฐœ๋… โฌ‡
// ์ปดํฌ์ง€์…˜
public class PrincipalDetail {
    private User user; // ์ฝคํฌ์ง€์…˜ (๊ฐ์ฒด๋ฅผ ํ’ˆ๊ณ  ์žˆ๋Š” ๊ฒƒ) }
    
// ์ƒ์†
public class PrincipalDetail extends User { }
- ์ƒ์† - 'IS-A' ๊ด€๊ณ„
- ์ปดํฌ์ง€์…˜ - 'HAS-A' ๊ด€๊ณ„
- DI - ?????

'IS-A', 'HAS-A' ๊ด€๊ณ„๋Š” ์ƒ์†, ์œ„์ž„์„ **์ •์ ์ธ ํด๋ž˜์Šค** ๊ด€๊ณ„์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
**DI**๋Š” 'HAS-A' ๊ด€๊ณ„์—์„œ **๋™์ ์œผ๋กœ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•**์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.

์ฆ‰, 'HAS-A' ๊ด€๊ณ„๋กœ ๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค(์ถ”์ƒ ํด๋ž˜์Šค)์— ์˜์กดํ•˜๋„๋ก ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๊ฒƒ๊นŒ์ง€ ์ธ๋ฐ, DI๋Š” ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•ด์„œ ๋™์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค.

< PrincipalDetailService >

@Service // Bean ๋“ฑ๋ก
public class PrincipalDetailService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    // ์Šคํ”„๋ง์ด ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑŒ ๋•Œ, username๊ณผ password ๋ณ€์ˆ˜ 2๊ฐœ๋ฅผ ๊ฐ€๋กœ์ฑ”
    // password ์ฒ˜๋ฆฌ๋Š” ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ํ•จ
    // ๋‚˜๋Š” username์ด ํ•ด๋‹น DB์— ์žˆ๋Š”์ง€๋งŒ ํ™•์ธํ•ด์„œ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋จ
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User principal = userRepository.findByUsername(username) // Optional ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— .orElseThrow
                .orElseThrow(()->{
                    return new UsernameNotFoundException("ํ•ด๋‹น ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." + username);
                });

        return new PrincipalDetail(principal); // ์ด๋•Œ ์‹œํ๋ฆฌํ‹ฐ ์„ธ์…˜์— ์œ ์ €์ •๋ณด ์ €์žฅ๋จ
    }
}

์ƒ์†๋ฐ›์•„ ํƒ€์ž…์„ UserDetailService ๋กœ ํ•œ๋‹ค.
์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ loadUserByUsername ํ•จ์ˆ˜์—์„œ๋Š” ๊ฐ€๋กœ์ฑˆ username ๋ณ€์ˆ˜๊ฐ€ DB์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋กœ๊ทธ์ธ์ด ์š”์ฒญ๋  ๋•Œ loadUserByUsername ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉด์„œ username์— ํ•ด๋‹นํ•˜๋Š” User๋ฅผ ์ฐพ๊ณ  PrincipalDetail ํƒ€์ž…(์ฆ‰, UserDetails ํƒ€์ž…)์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
-> UserDetails ํƒ€์ž…์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ ์‹œํ๋ฆฌํ‹ฐ์˜ ์„ธ์…˜์— ์œ ์ € ์ •๋ณด๊ฐ€ ์ €์žฅ์ด ๋จ.

์ด ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์šฐ๋ฆฌ์˜ ์ง„์งœ(?) User ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค.

< UserRepository >

public interface UserRepository extends JpaRepository<User, Integer> {

    // SELECT * FROM user WHERE username = 1?;
    Optional<User> findByUsername(String username);
}

findByUsername ์—†์–ด์„œ UserRepository์—์„œ ๋งŒ๋“ค์—ˆ๋‹ค. (๋„ค์ด๋ฐ ๊ทœ์น™)


< SecurityConfig > ์— ์ถ”๊ฐ€

    // ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋Œ€์‹  ๋กœ๊ทธ์ธ ํ•จ -> password ๊ฐ€๋กœ์ฑ”
    // ๊ฐ€๋กœ์ฑˆ password๊ฐ€ ํšŒ์›๊ฐ€์ž… ๋  ๋•Œ ๋ฌด์—‡์œผ๋กœ ํ•ด์‰ฌ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„์•ผํ•จ -> ๊ทธ๋ž˜์•ผ ๊ฐ™์€ ํ•ด์‰ฌ๋กœ ์•”ํ˜ธํ™” ํ•˜๊ณ  DB์— ์žˆ๋Š” ํ•ด์‰ฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋กœ๊ทธ์ธ
    // ์ฆ‰, ํŒจ์Šค์›Œ๋“œ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(principalDetailService).passwordEncoder(encodePWD()); // passwordEncoder ํ•˜๋Š” ์• ๊ฐ€ encodePWD ์ž„.
    }

์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ ํ•œ password๋ฅผ encode ํ•ด์„œ ๋น„๊ต๋ฅผ ํ•œ๋‹ค.

< SecurityConfig > ์ตœ์ข…

@Configuration // ๋นˆ ๋“ฑ๋ก (IoC๊ด€๋ฆฌ)
@EnableWebSecurity // Security ํ•„ํ„ฐ๊ฐ€ ๋“ฑ๋ก๋จ = ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ด๋ฏธ ํ™œ์„ฑํ™”๋Š” ๋˜์–ด์žˆ์ง€๋งŒ, ์„ค์ •์€ ํ•ด๋‹น ํŒŒ์ผ์—์„œ ํ•  ๊ฒƒ์ž„
@EnableGlobalMethodSecurity(prePostEnabled = true) // ํŠน์ • ์ฃผ์†Œ๋กœ ์ ‘๊ทผ์„ ํ•˜๋ฉด ๊ถŒํ•œ ๋ฐ ์ธ์ฆ์„ ๋ฏธ๋ฆฌ ์ฒดํฌ (์ˆ˜ํ–‰ํ•œ ํ›„์— ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private PrincipalDetailService principalDetailService;

    // 1. Bean ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ฉ”์„œ๋“œ์— ๋ถ™์—ฌ์„œ ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ
    @Bean // IoC๊ฐ€ ๋œ๋‹ค.
    public BCryptPasswordEncoder encodePWD() {
        return new BCryptPasswordEncoder(); // ์ด ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๊ฒŒ ๋จ. ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€์ ธ๊ฐ€์„œ ์“ฐ๋ฉด ๋œ๋‹ค.
    }

    // 2. ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ ์–ด๋–ค ์•”ํ˜ธํ™”๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ ๋น„๋ฒˆ์„ ๋น„๊ตํ• ์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•จ.
    // ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋Œ€์‹  ๋กœ๊ทธ์ธ ํ•จ -> password ๊ฐ€๋กœ์ฑ”
    // ๊ฐ€๋กœ์ฑˆ password๊ฐ€ ํšŒ์›๊ฐ€์ž… ๋  ๋•Œ ๋ฌด์—‡์œผ๋กœ ํ•ด์‰ฌ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„์•ผํ•จ -> ๊ทธ๋ž˜์•ผ ๊ฐ™์€ ํ•ด์‰ฌ๋กœ ์•”ํ˜ธํ™” ํ•˜๊ณ  DB์— ์žˆ๋Š” ํ•ด์‰ฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋กœ๊ทธ์ธ
    // ์ฆ‰, ํŒจ์Šค์›Œ๋“œ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(principalDetailService).passwordEncoder(encodePWD()); // passwordEncoder ํ•˜๋Š” ์• ๊ฐ€ encodePWD ์ž„.
    }

    // 3. ํ•„ํ„ฐ๋ง
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable() // csrf ํ† ํฐ ๋น„ํ™œ์„ฑํ™” (ํ…Œ์ŠคํŠธ์‹œ ๊ฑธ์–ด๋‘๋Š”๊ฒŒ ์ข‹์Œ)
                .authorizeRequests() // request๊ฐ€ ๋“ค์–ด์˜ค๋ฉด
                .antMatchers("/", "/auth/**", "/js/**", "/css/**", "/image/**") // ์—ฌ๊ธฐ๋กœ ๋“ค์–ด์˜ค๋ฉด
                .permitAll() // ๋ชจ๋‘ ๊ฐ€๋Šฅ (๋ˆ„๊ตฌ๋‚˜ ๊ฐ€๋Šฅ)
                .anyRequest() // ๊ทธ๊ฒŒ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์ฒญ์€
                .authenticated() // ์ธ์ฆ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค
                .and()
                .formLogin()
                .loginPage("/auth/loginForm") // ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ์€ ์ด ๋กœ๊ทธ์ธ ํผ์œผ๋กœ ์˜จ๋‹ค
                .loginProcessingUrl("/auth/loginProc") // ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์š”์ฒญ์ด ์˜ค๋Š” ๋กœ๊ทธ์ธ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋Œ€์‹  ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.
                .defaultSuccessUrl("/"); // ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด "/"๋กœ ๊ฐ„๋‹ค.
//                .failureUrl("/fail"); // ์‹คํŒจ์‹œ url
    }

    // ์ฐธ๊ณ  : .headers().frameOptions().disable() // ์•„์ดํ”„๋ ˆ์ž„ ์ ‘๊ทผ ๋ง‰๊ธฐ
    // ์ฐธ๊ณ  : .csrf().disable() // csrf ํ† ํฐ ๋น„ํ™œ์„ฑํ™” (ํ…Œ์ŠคํŠธ์‹œ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ)
}

์œ„์—๊นŒ์ง€ ํ•˜๋ฉด, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ธ์…˜์— ์œ ์ € ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ UserDetail ํƒ€์ž…์œผ๋กœ PrincipalDetail๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ PrincipalDetail๋กœ ๊ฐ์‹ธ์„œ ์ €์žฅ๋  ๊ฒƒ์ด๋‹ค.

โ“ ๊ทธ๋Ÿฌ๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๋งŒ๋“  ์„ธ์…˜ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„๊นŒ?

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ๋œ ์„ธ์…˜์„ ์ฐพ๋Š” ๋ฐฉ์‹ : @AuthenticationPrincipal PrincipalDetail principal
   @GetMapping({"", "/"})
    public String index(@AuthenticationPrincipal PrincipalDetail principal) { // ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ๋œ ์„ธ์…˜์„ ์ฐพ๋Š” ๋ฐฉ์‹ : @AuthenticationPrincipal PrincipalDetail principal
        // /WEB-INF/views/index.jsp
        System.out.println("๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ์•„์ด๋””:"+principal.getUsername());
        return "index";
    }

์œ„์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ PrincipalDetail principal๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์€ ๋˜์ง€๋งŒ,
์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ @Autowired private PrincipalDetail principal; ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

profile
๐Ÿ“š

0๊ฐœ์˜ ๋Œ“๊ธ€