Subject — 보안 주체

Subject — 보안 주체

Subject는 사람 같은 단일 개체에 대한 관련 정보의 묶음(grouping)을 나타내는 클래스예요. 그런 정보에는 Subject의 정체(identity)뿐 아니라 보안 관련 속성(예: 비밀번호, 암호화 키)도 포함돼요.

출처: Java API Reference

본문

public final class Subject extends Object implements Serializable

Principal과 Credential

Subject는 잠재적으로 여러 개의 정체를 가질 수 있어요. 각 정체는 Subject 안에서 Principal로 표현돼요. Principal은 단순히 이름을 Subject에 묶는 역할을 해요. 예를 들어 사람인 Subject, 앨리스는 두 개의 Principal을 가질 수 있어요. 하나는 운전면허증 이름 "Alice Bar"Subject에 묶고, 다른 하나는 학생증 번호 "999-99-9999"Subject에 묶어요. 두 Principal은 이름이 달라도 같은 Subject를 가리켜요.

Subject는 보안 관련 속성인 credential도 소유할 수 있어요. 특별한 보호가 필요한 민감한 자격 증명(예: 개인 암호화 키)은 개인 credential Set에 저장돼요. 공유되기 위한 자격 증명(예: 공개 키 인증서, Kerberos 서버 티켓)은 공개 credential Set에 저장돼요. 서로 다른 credential Set에 접근·수정하는 데는 서로 다른 권한이 필요해요.

어떻게 다루나요?

Subject에 연관된 모든 Principal을 가져오려면 getPrincipals 메서드를 호출해요. Subject에 속한 모든 공개 또는 개인 자격 증명을 가져오려면 각각 getPublicCredentialsgetPrivateCredentials 메서드를 호출해요. 반환된 Set of Principals와 자격 증명을 수정하려면 Set 클래스에 정의된 메서드를 사용해요.

Subject subject;
Principal principal;
Object credential;

// add a Principal and credential to the Subject
subject.getPrincipals().add(principal);
subject.getPublicCredentials().add(credential);

직렬화

Subject 클래스는 Serializable을 구현해요. Subject에 연관된 Principals는 직렬화되지만, 자격 증명은 직렬화되지 않아요. java.security.Principal 클래스 자체는 Serializable을 구현하지 않는다는 점을 기억해야 해요. 따라서 Subject에 연관된 모든 구체적인 Principal 구현체는 Serializable을 구현해야 해요.

JAAS에서의 역할

Subject는 JAAS 인증의 중심 개념이에요. 인증이 성공하면 LoginContext가 인증된 Subject를 만들어주고, 그 안에 사용자의 정체(Principal)와 자격 증명(키, 티켓 등)이 채워져요. 이후 Subject.doAs(...)를 활용하면 그 Subject의 권한으로 코드를 실행할 수 있어요.

더 알아보기 (Learn more)