Spring Security / / 2024. 10. 28. 13:44

Credential, Principal

보안에서 **Credential(자격 증명)**과 **Principal(주체)**는 시스템이 사용자 또는 시스템의 신원을 확인하고 접근을 관리하는 데 중요한 역할을 하는 개념입니다. 두 개념 모두 인증(Authentication)과 권한 부여(Authorization)를 위한 핵심 요소입니다. Spring Security에서도 이 개념을 바탕으로 사용자 관리 및 보안 기능을 제공합니다.

 

Credential(자격 증명)

 

Credential은 사용자가 시스템에 접근하기 위해 필요한 정보를 의미합니다. 자격 증명은 사용자가 시스템에 로그인하거나 특정 리소스에 접근할 때, 그 사용자가 누구인지 확인하는 정보로 활용됩니다. 시스템은 이 정보를 바탕으로 사용자가 허가된 사용자임을 확인하고, 인증이 성공하면 사용자에게 적절한 권한을 부여하여 리소스 접근을 허용합니다.

 

주요 Credential 유형

 

1. 사용자 이름과 비밀번호:

가장 일반적인 형태의 자격 증명입니다. 사용자는 로그인 시 자신의 아이디와 비밀번호를 입력하여 인증을 받으며, 시스템은 데이터베이스에 저장된 정보와 일치하는지 확인합니다.

비밀번호는 일반적으로 암호화되어 저장되며, 로그인 시 입력한 비밀번호와 비교해 인증합니다.

2. 토큰(Token):

RESTful API와 같은 무상태(stateless) 애플리케이션에서는 토큰 기반 인증이 널리 사용됩니다. 인증 서버가 발급한 액세스 토큰(Access Token) 또는 리프레시 토큰(Refresh Token)을 통해 사용자 인증을 수행합니다.

Bearer 토큰 방식으로 클라이언트가 요청 시 인증 정보를 포함하여 서버로 전달하며, 토큰은 일정 기간 동안 유효합니다.

3. 인증서(Certificates):

서버 간의 보안을 위해 SSL/TLS 인증서를 사용하여 신뢰할 수 있는 서버 간 통신을 보장합니다. 인증서는 공개 키 암호화 방식을 사용하여 시스템 간 데이터 무결성과 보안을 강화합니다.

주로 금융 시스템이나 보안이 중요한 시스템에서 많이 사용됩니다.

4. 생체 정보(Biometrics):

생체 인식 기반의 자격 증명으로, 얼굴 인식, 지문, 홍채 등의 정보를 활용해 사용자를 식별합니다. 이러한 방식은 추가 인증 수단으로 사용되며, 모바일 애플리케이션에서 특히 많이 활용됩니다.

5. OTP 및 2FA 자격 증명:

OTP(One-Time Password, 일회용 비밀번호)나 2FA(2-Factor Authentication, 이중 인증)는 추가적인 보안 계층으로, 사용자가 로그인할 때 임시로 생성된 PIN, 문자 메시지 코드 등을 입력해 인증합니다.

은행 서비스나 민감한 데이터에 접근할 때 추가 보안 수단으로 활용됩니다.

 

Credential의 역할

 

Credential은 시스템이 사용자 또는 시스템의 신원을 정확히 확인하고, 해당 신원이 인증된 후에만 자원에 접근할 수 있도록 관리하는 중요한 역할을 합니다. 사용자의 자격 증명이 시스템과 일치하면 시스템은 해당 사용자에게 필요한 리소스에 접근할 수 있는 권한을 부여합니다. 이를 통해 각 사용자에 대해 세부적인 접근 제어가 가능해지며, 보안이 강화됩니다.

 

Principal(주체)

 

Principal은 인증된 사용자나 시스템을 나타내는 객체로, 인증이 완료된 후 사용자의 신원 정보를 보안 컨텍스트(Security Context)에 저장합니다. Principal은 주로 인증된 사용자를 나타내며, 이를 통해 시스템은 특정 리소스나 기능에 대한 접근 권한을 설정할 수 있습니다.

 

Principal의 역할과 개념

 

1. 사용자 신원 정보 보유:

Principal은 인증된 사용자의 정보를 포함합니다. 인증 과정이 완료되면 사용자의 ID, 권한 정보 등이 Principal 객체에 포함되어 보안 컨텍스트에 저장됩니다.

예를 들어, 사용자가 로그인을 완료하면 Principal 객체는 해당 사용자의 이름, 역할(Role) 등의 정보를 포함합니다.

2. 권한 부여와 접근 제어:

애플리케이션은 Principal 객체를 통해 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하고, 이를 통해 적절한 권한을 가진 사용자에게만 접근을 허용합니다.

Spring Security와 같은 프레임워크에서는 Principal 정보를 이용해 사용자 권한을 설정하고, 필요한 경우 접근을 제한하여 리소스를 보호합니다.

3. Spring Security의 Principal:

Spring Security에서는 Authentication 객체가 Principal을 포함하며, 이 객체는 SecurityContextHolder에 저장됩니다.

Principal은 주로 UserDetails 객체 형태로 구현되며, 사용자의 세부 정보를 포함하고 있습니다. 이를 통해 인증된 사용자의 정보를 Spring Security의 다양한 기능에서 활용할 수 있습니다.

 

Principal 예시

 

Spring Security에서 Principal 정보를 가져오는 방법은 다음과 같습니다:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/user")
    public String getUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String username = authentication.getName(); // Principal의 사용자 이름
        return "Hello, " + username;
    }
}

 

위 코드에서 SecurityContextHolder는 현재 인증된 사용자의 Principal 정보를 가져오는 역할을 합니다. authentication.getName() 메서드를 통해 사용자 이름을 확인할 수 있으며, 보안 설정이나 접근 제어가 필요할 때 사용됩니다.

 

Credential과 Principal의 차이점

 

Credential(자격 증명): 사용자가 자신의 신원을 증명하기 위해 시스템에 제공하는 정보입니다. 시스템이 인증에 사용하는 정보이며, 일반적으로 로그인 정보와 같은 민감한 데이터입니다.

Principal(주체): 인증이 완료된 후, 시스템이 인증된 사용자를 나타내는 객체입니다. 인증이 성공한 후에는 Credential이 필요하지 않으며, Principal 객체를 통해 사용자의 신원과 권한을 계속 추적할 수 있습니다.

 

정리

 

**Credential(자격 증명)**은 시스템이 사용자 또는 시스템의 신원을 확인하고 인증하기 위한 정보이며, 사용자는 이를 통해 시스템에 접근 권한을 얻습니다. 자격 증명은 사용자 이름과 비밀번호, 토큰, 인증서 등으로 다양하게 구현됩니다.

**Principal(주체)**는 인증된 사용자나 시스템을 나타내며, 보안 컨텍스트(Security Context)에서 사용자의 권한 및 신원을 추적합니다. 인증이 완료된 후 Principal 객체는 Spring Security와 같은 프레임워크에서 세부적인 접근 제어와 권한 관리를 위한 기반이 됩니다.

 

Spring Security에서는 SecurityContextHolderAuthentication 객체를 통해 Principal을 활용하여, 인증된 사용자의 정보와 권한을 확인할 수 있습니다. Credential과 Principal 개념을 바탕으로 시스템은 사용자를 식별하고 적절한 보안 정책을 적용하여 접근을 관리할 수 있게 됩니다.

'Spring Security' 카테고리의 다른 글

UserDetailsService, PasswordEncoder, AuthenticationProvider  (0) 2024.10.29
JSON Web Token  (0) 2024.10.28
SHA-256  (4) 2024.10.28
자체 서명된 인증서 생성하기  (1) 2024.10.28
Spring Security  (0) 2024.10.28
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유