보안에서 **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에서는 SecurityContextHolder와 Authentication 객체를 통해 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 |