0+ 스프링/0+ 스프링 Security

[스프링 시큐리티] 1. 기본 API 및 Filter 이해(로그인, 로그아웃 -WebSecurityConfigurerAdapter)

힘들면힘을내는쿼카 2022. 12. 20. 23:07
728x90
반응형

[스프링 시큐리티] 1. 기본 API 및 Filter 이해(WebSecurityConfigurerAdapter)

해당 포스팅은 인프런에서 스프링 시큐리티 정수원님의 강의를 참고하여 작성했습니다.
스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

 

스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 인프런 | 강의

초급에서 중.고급에 이르기까지 스프링 시큐리티의 기본 개념부터 API 사용법과 내부 아키텍처를 학습하게 되고 이를 바탕으로 실전 프로젝트를 완성해 나감으로써 스프링 시큐리티의 인증과

www.inflearn.com

 

로그인, 로그아웃은 단순해 보이지만 보안이라는 측면에서 엄청 중요한 역할을 합니다.

스프링 시큐리티는 어떻게 로그인, 로그아웃을 간편하게 구현할수 있도록 할까요?

 

🔐 인증과 인가

인증(Authentication) vs. 인가(Authorization)

보안과 관련된 스프링 시큐리티를 이해하기 위해서 먼저 인증인가에 대해서 알아야 합니다.!
비슷한 뜻인것 같지만, 서로 다른 역할로 시용되기 때문에 확실히 알고 계셔야 합니다.
바로 가시죠!

 

인증(Authentication)

https://www.nykorean.net/gnu5/bbs/board.php?bo_table=imininfo&wr_id=188

인증은 어떤 오브젝트의 신원을 확인하는 과정입니다.
쉽게 이야기하면 공항에서의 출입국심사와 비슷하다고 생각하면 됩니다.
오브젝트가 해당 서버에 접속할때 오브젝트는 서버의 인증요소를 증거로 제시하여 자신을 입증 합니다.

 

인가(Authorization)

https://love.seoul.go.kr/asp/articleView.asp?intSeq=1385

인가는 인증과는 조금 다릅니다.

오브젝트가 서버의 자원에 접근할수 있는지, 또는 어떤 동작을 수행할 수 있는지 검증하는 단계 입니다.
쉽게 이야기하면 인증은 출입국심사에 비유하자면, 인증은 그 이후를 말할 수 있습니다.

출입국심사를 완료하고 당신은 버스를 타고 시내로 이동하려고 합니다.
이때 버스라는 자원을 이용하기 위해서 버스 티켓을 제시합니다.
이러한 과정이 인가라고 할수 있습니다.

 

인터넷 기반에서는 일반적으로 토큰이라는 가공물을 사용하여 인가를 다룹니다.
유저가 로그인을 하면(인증과정) 유저의 권한에 맞는 토큰을 제공합니다.


이 토큰에 맞게 유저는 서버의 자원을 이용할 수 있습니다.
서버는 토큰을 이용해서(인가과정) 자원에 대하여 허용할지 거부할지를 결정합니다.

 

정리

  • 인증(Authentication)은 인가(Authorization)로 이어지지만, 인가(Authorization)는 인증(Authentication)으로 이어질수 없다.

 

스프링 시큐리티

스프링 시큐리티 의존성을 추가했을 때, 다음과 같은 보안 구성이 제공됩니다.

  • 모든 HTTP 요청 경로는 인증(Authentication) 되어야 합니다.
  • 인증 방식은 formLogin, httpBasic 로그인 방식을 제공합니다.
  • 기본 로그인 페이지를 제공합니다.
    • 기본 계정 1개 제공
    • username: user, password: 랜덤 문자열

 

MySecurityConfig 설정

기본적으로 WebSecurityConfigurerAdapter을 상속받아 클래스를 생성합니다.

스프링 시큐리티의 웹 보안 기능 초기화 및 설정 입니다.
현재(2022년 12월 기준)는 WebSecurityConfigurerAdapter@Deprecated가 되었습니다.

 

@Configuration
@EnableWebSecurity // 웹 보안 활성화
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests() //요청에 대한 보안 검사
            .anyRequest().authenticated() //어떤 요청에도 인증을 받음

        http
            .formLogin(); //formLogin 방식
    }
}

 

application.yml을 아래와 같이하면 비밀번호를 설정할 수 있습니다.

spring:
  security:
    user:
      name: user
      password: 123

 

localhost:8080으로 접속

 

로그인(Form 인증)

Form 인증 로그인에 대해서 알아봅시다.
먼저 코드부터 보여드리겠습니다.

MySecurityConfig

@Configuration
@EnableWebSecurity // 웹 보안 활성화
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .anyRequest().authenticated();

        http
        .formLogin() // from 로그인 인증 기능 동작
        .loginPage("/loginPage") // 사용자 정의 로그인 페이지
        .defaultSuccessUrl("/home", false) // 로그인 성공 후 이동 페이지(default false)
        .failureUrl("/login") // 로그인 실패 후 이동 페이지
        .usernameParameter("userId") // 아이디 파라미터명 설정
        .passwordParameter("passwd") // 패스워드 파라미터명 설정
        .loginProcessingUrl("/login_proc") // 로그인 from action url
        //.successHandler() // 로그인 성공 후 핸들러
        //.failureHandler() // 로그인 실패 후 핸들러
        .permitAll();

    }
}
  • defaultSuccessUrl(“/home”, false)
    • false: 로그인 성공 후 이동할 페이지를 변경할 수 있음
      • 로그인 인증 이후에 이동할 페이지를 임의로 설정하거나 인증 이전의 페이지로 리다이렉트 할 수 있습니다.
    • true: 로그인 성공 후 반드시 설정한 url 로 이동

 

MySecurityController

@RestController
public class MySecurityController {

    @GetMapping("/home")
    public String index() {
        return "home";
    }

    @GetMapping("/loginPage")
    public String loginPage() {
        return "loginPage";
    }
}

 

Form 인증 과정

 

 

loginProcessingUrl

loginPage("/loginPage") 를 주석처리해서 확인해보면 다음과 같습니다.


loginProcessingUrl(“/login_proc”);에 의해서 method=“post” action=“/login_proc”로 설정된 것을 확인할 수 있습니다.

 

usernameParameter("userId") 에서 설정한 값이 적용된것을 확인할 수 있습니다.
passwordParameter("passwd") 에서 설정한 값이 적용된것을 확인할 수 있습니다.

 

로그아웃

MySecurityConfig

@Configuration
@EnableWebSecurity // 웹 보안 활성화
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/home2").permitAll() // 인증없이 허용
        .anyRequest().authenticated();

        http
        .formLogin();

        http
        .logout() //로그아웃 처리
        .logoutUrl("/logout") //로그아웃 처리 url
        .logoutSuccessUrl("/login") //로그아웃 성공 후 url
        .deleteCookies("JSESSIONID", "remember-me") // 로그아웃 후 쿠키삭제
        .addLogoutHandler(new LogoutHandler() { //로그아웃 핸들러
            @Override
            public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
                HttpSession session = request.getSession();
                session.invalidate();
            }
        })
        .logoutSuccessHandler(new LogoutSuccessHandler() { //로그아웃 성공 후 핸들러
            @Override
            public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                response.sendRedirect("/home2"); // home2로 리다이렉션
            }
        });
    }
}

 

MySecurityController

@RestController
public class MySecurityController {
    @GetMapping("/home2")
    public String home2() {
        return "home2";
    }
}

 

로그아웃 과정

일반적인 로그아웃 과정은 다음과 같습니다.

 


앞 예시에서는 SimpleUrlLogoutHandler에서 logoutSuccessHandler를 거쳐 /home2로 리다이렉트한다.

 

다음시간에는 Remember - me 에 대해서 알아봅시다.!

 

 

 

728x90
반응형