본문 바로가기
SpringSecurity OAuth2

<Step 0> 선수 지식 - Spring Security

by 서영선 2023. 8. 31.

📌 SecurityBuilder / SecurityConfigurer

✔ 개념 및 구조

SecurityBuilder 는 빌더 클래스로서 웹 보안을 구성하는 빈 객체와 설정 클래스들을 생성하는 역할을 하며 WebSecurity, HttpSecurity 가 있다.

SecurityConfigurer 는 Http 요청과 관련된 보안 처리를 담당하는 필터들을 생성하고 여러 초기화 설정에 관여한다.

SecurityBuilderSecurityConfigurer 를 포함하고 있으며 인증 및 인가 초기화 작업은 SecurityConfigurer 에 의해 진행된다. 

 

 

 

 

 

 

📌 CustomSecurityConfigurer 만들기

✔ 자동 설정에 의한 초기화 진행

@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {

    http.authorizeRequests().anyRequest().authenticated();
    http.formLogin();
    http.httpBasic();
    
    return http.build();
}

 

 

 

 

✔ 커스텀 설정 클래스 생성

@Bean
@Order(0)
public SecurityFilterChain securityFilterChain1(HttpSecurity http) throws Exception{
    http.authorizeHttpRequests().anyRequest().authenticated();
    http.formLogin();
    
    return http.build();
}



@Bean
@Order(1)
public SecurityFilterChain securityFilterChain2(HttpSecurity http) throws Exception{
    http.authorizeHttpRequests().anyRequest().authenticated();
    http.httpBasic();
    
    return http.build();
}

*사용자 정의 클래스 생성시 SecurityFilterChain와 WebSecurityConfigurerAdapter 두 가지 방식으로 모두 설정할 수 없으며 하나만 정의해야 한다.

 

 

 

 

 

 

 

 

 

 

📌 시큐리티 인증 및 인가 흐름 요약

1. Servlet Filter

2. Authentication

3. Authorization

4. Spring MVC

의 순서로 진행

 

 

 

 

📌 HttpBasic 인증

✔ HttpBasic 인증

Http는 액세스 제어와 인증을 위한 프레임워크를 제공하며, 가장 일반적인 인증 방식은 "Basic" 인증 방식이다.

RFC 7235 표준이며 인증 프로토콜은 HTTP 인증 헤더에 기술되어 있다.

< 순서 >

  1.  클라이언트는 인증 정보없이 서버로 접속을 시도한다.
  2.  서버가 클라이언트에게 인증 요구를 보낼 때 401 Unauthorized 응답과 함께 WWW-Authenticate 헤더를 기술해서 realm(보안 영역)과 Basic 인증 방법을 보냄
  3. 클라이언트가 서버로 접속할 때 Base64로 username과 password를 인코딩하고 Authroization 헤더에 담아서 요청함
  4. 성공적으로 완료되면 정상적인 상태 코드를 반환한다. 

 

※ baswe-64 인코딩된 값은 쉽게 디코딩할 수 있기 때문에 인증 정보가 노출되므로, HTTP Basic 인증 방식은 반드시 HTTPS 와 같이 TLS 기술과 함께 사용해야 한다.

 

 

 

 

✔ HttpBasicConfigurer

  • Http Basic 인증에 대한 초기화를 진행하며 속성들에 대한 기본 값들을 설정한다.
  • 기본 AuthenticationEntryPoint는 BasicAuthenticationEntryPoint 이다.
  • 필터는 BasicAuthenticationFilter를 사용한다.

 

 

 

 

 

 

 

✔ BasicAuthenticationFilter

 

  • 이 필터는 기본 인증 서비스를 제공하는데 사용한다.

 

  • BasicAuthenticationConverter를 사용해서 요청 헤더에 기술된 인증 정보의 유효성을 체크하여 Base64로 인코딩된 username과 password를 추출한다.

 

  • 인증이 성공하면 Authentication이 SecurityContext에 저장되고, 인증이 실패하면 Basic 인증을 통해 다시 인증하라는 메시지를 표시하는 BasicAuthenticationEntryPoint 가 호출된다.

 

  • 인증 이후 세션을 사용하는 경우와 사용하지 않는 경우에 따라 처리되는 흐름에 차이가 있다. 세션을 이용하는 경우 매 요청마다 인증 과정을 거치지 않으나 세션을 사용하지 않는 경우 매 요청마다 인증 과정을 거쳐야 한다.

 

 

 

 

 

 

 

 

 

✔ API

protected void configure(final HttpSecurity http) throws Exception {
	http
    	.authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .httpBasic()
        .authenticationEntryPoint(new CustomAuthenticationEntryPoint())
    ;
}

 

 

 

 

 

 

 

📌 Cors 이해

✔ CORS (Cross-Origin Resource Sharing, 교차 출처 리소스 공유)

HTTP 헤더를 사용하여, 한 출처에서 실행중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제

웹 애플리케이션 리소스가 자신의 출처와 다를 때 브라우저는 요청 헤더에 Origin 필드에 요청 출처를 함께 담아 교차 출처 HTTP 요청을 실행한다.

출처를 비교하는 로직은 서버에 구현된 스펙이 아닌 브라우저에 구현된 스펙 기준으로 처리되며 브라우저는 클라이언트의 요청 헤더와 서버의 응답 헤더를 비교해서 최종 응답을 결정한다.

두 개의 출처를 비교하는 방법은 URL의 구성요소 중 Protocol, Port, Host 이 세가지가 동일한지 확인하면 되고, 나머지는 틀려도 상관없다.

 

 

 

✔ Simple Request   VS   Preflight Request (예비 요청)

 

👀 Simple Request

: 예비 요청 과정없이 바로 서버에 본 요청을 한 후, 서버가 응답의 헤더에 Access-Control-Allow-Origin 과 같은 값을 전송하면 브라우저가 서로 비교 후 CORS 정책 위반 여부를 검사라는 방식이다.

 

< 제약 사항 >
1. GET, POST, HEAD 중 하나의 Method를 사용해야 한다.

2. 헤더는 Accept, Accept-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width Width 만 가능하       고, Custom Header 는 허용되지 않는다.

3. Content-Type은 application/x-www-form-urlencoded, multipart/form-data, text/plain 만 가능하다.

 

 

 

👀 Preflight Request (예비 요청)

: 브라우저는 요청을 한번에 보내지 않고, 예비 요청과 본요청으로 나누어 서버에 전달하는데 브라우저가 예비요청을 보내는 것을 Preflight라 하고, 이 예비 요청의 메소드에는 OPTIONS가 사용된다.

 

예비 요청의 역할은  본 요청을 보내기 전에 브라우저 스스로 안전한 요청인지 확인하는 것으로 요청 사항이 Simple Request가 아닌 경우 브라우저가 Preflight Request를 실행한다.

 

 

 

 

 

✔ CORS 해결 - 서버에서 Access-Control-Allow-* 세팅

  • Access-Control-Allow-Origin : 헤더에 작성된 출처만 브라우저가 리소스를 접근할 수 있도록 허용한다.
  • Access-Control-Allow-Mehtod : preflight request 에 대한 응답으로 실제 요청 중에 사용할 수 있는 메서드를 나타낸다.
  • Access-Control-Allow-Headers : preflight request 에 대한 응답으로 실제 요청 중에 사용할 수 있는 헤더 필드 이름을 나타낸다.
  • Access-Control-Allow-Credentials : 실제 요청에 쿠키나 인증 등의 사용자 자격 증명이 포함될 수 있음을 나타낸다
  • Access-Control-Max-Age : preflight 요청 겨로가를 캐시할 수 있는 시간을 나타내는 것으로 해당 시간 동안은 preflight 요청을 다시 하지 않게 된다. 

 

 

 

✔ API

@Override
protected void configure(final HttpSecurity http) throws Exception{
    http
    	.authorizeRequests()
        .anyRequest().authenticated()
        .and();
        
    http.cors().configurationSource(corsConfigurationSource());
}


@Bean
public CorsConfigurationSource corsConfigurationSource() {
    
    CorsConfiguration configuration = new CorsConfiguration();
    
    configuration.addAllowOrigin("*");
    configuration.addAllowedMethod("*");
    configuration.addAllowedHeader("*");
    configuration.setAllowCredentials(true);
    configuration.setMaxAge(3600L);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**",configuration);
    
    return source;
}

 

 

 

 

 

 

 

 

 

 

😀 Spring Security에 대한 사전 지식이 준비가 되었다면, 이제 OAuth2 에 대해 공부해보자!!!

 

 

 

 

 

 

'SpringSecurity OAuth2' 카테고리의 다른 글

<Step 3> OAuth2.0 Client  (0) 2023.09.19
<Step 2> OAuth2 권한 부여 타입  (0) 2023.09.03
<Step 1> OAuth 2.0 개념  (0) 2023.09.02
[10강] 페이스북 로그인  (0) 2023.08.02
[6강] 구글 로그인 준비  (0) 2023.07.29

댓글