Spring/security

[시큐리티] 인증 방법

라임온조 2023. 3. 10. 11:03

1. http basic 인증

1) 개념

2) 방법

  • username:password 문자열을 Base64로 인코딩한다
  • Authorization 헤더의 값으로 Basic + 위의 인코딩값을 설정하고 보낸다

3) 설정

@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.httpBasic();

        http.authorizeRequests().anyRequest().authenticated();
    }
}

4) 특징

  • 자격 증명의 기밀성을 보장하지 않는다
  • base64는 단지 전송의 편의를 위한 인코딩 방법이고 암호화나 해싱 방법이 아니므로 전송 중에 자격 증명을 가로채면 누구든지 볼 수 있다
  • 일반적으로는 최소한의 기밀을 위해 https를 이용할 때가 아니면 http basic 인증은 이용하지 않는다

5) 맞춤 구성

특정 인증 방식을 이용하는 보호 공간인 영역 이름 변경

@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.httpBasic(c -> {
            c.realmName("OTHER");
        });

        http.authorizeRequests().anyRequest().authenticated();
    }
}

인증이 실패했을 때의 응답 맞춤 구성 가능

  • AuthenticationEntryPoint 구현
public class CustomEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.addHeader("message", "Luke, i am your father!");
        httpServletResponse.sendError(HttpStatus.UNAUTHORIZED.value());
    }
}

애플리케이션이 민감한 데이터를 클라이언트에 노출하지 않도록 응답 본문을 필터링하는 논리 작성 가능

2. 양식 기반 로그인(formLogin)

1) 개념

사용자가 자격 증명을 입력할 수 있는 사용자 친화적인 로그인 양식을 제공하고 인증된 사용자가 로그인 후 웹 페이지 사이를 탐색하고 로그아웃할 수 있는 기능

2) 설정

@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.formLogin()

        http.authorizeRequests().anyRequest().authenticated();
    }
}

3) 특징

  • 인증하지 않은 사용자는 자격 증명으로 인증하기 위한 양식으로 리디렉션됨
  • 인증한 후에는 애플리케이션이 사용자를 애플리케이션의 홈페이지로 리디렉션함
  • /logout 경로로 가면 로그아웃할 수 있는 곳으로 리디렉션됨
  • 존재하지 않는 경로에 가려고 하면 애플리케이션이 기본 오류 페이지를 표시
  • HTTP Basic 방식과 함께 이용이 가능

4) 맞춤 구성

defaultSuccessUrl()

  • 로그인 성공하면 디폴트로 이동하게 되는 경로 지정

AuthenticationSuccessHandler

  • 인증이 성공했을 때의 논리 맞춤 구성

AuthenticationFailureHandler

  • 인증이 실패했을 때의 논리 맞춤 구성

 

3. 인증을 위한 정적 헤더 값에 기반을 둔 식별

1) 개념

서버가 특정 문자열을 저장해놓고, 클라이언트가 HTTP 요청의 헤더에 문자열을 보냈을 때 서버에 저장된 것과 같은지 다른지 확인해서 같으면 인증 성공

2) 특징

  • 보안이 안 좋음
  • 단순하고 빠르게 실행됨

 

4. 대칭 키를 사용

1) 개념

Authorization 헤더에 클라이언트와 서버가 모두 알고 있는 키로 서명된 값이 서버에게 보내지면, 서버는 해당 서명을 본인이 가지고 있는 키로 풀어서 서버에 저장되어 있던 값과 같으면 인증 성공

 

5. OTP(일회용 암호) 사용

1) 개념

클라이언트가 OTP을 제공해주는 서비스에 요청을 보내 OTP를 받고 이를 헤더에 담아서 서버에 보낸다. 서버는 본인이 가지고 있는 OTP와 받은 걸 비교해서 같으면 인증 성공