보안 및 접근 제어
인증 액터, 권한 스코프, 접근 정책을 관리합니다.
로딩
local security = require("security")
actor
실행 컨텍스트에서 현재 보안 액터를 반환합니다.
local actor = security.actor()
if actor then
local id = actor:id()
local meta = actor:meta()
logger:info("Request from", {
user_id = id,
role = meta.role
})
end
반환: Actor|nil
scope
실행 컨텍스트에서 현재 보안 스코프를 반환합니다.
local scope = security.scope()
if scope then
local policies = scope:policies()
for _, policy in ipairs(policies) do
print("Active policy:", policy:id())
end
end
반환: Scope|nil
can
현재 컨텍스트가 리소스에 대한 액션을 허용하는지 확인합니다.
-- 읽기 권한 확인
if not security.can("read", "user:" .. user_id) then
return nil, errors.new("PERMISSION_DENIED", "Cannot read user data")
end
-- 쓰기 권한 확인
if not security.can("write", "order:" .. order_id) then
return nil, errors.new("PERMISSION_DENIED", "Cannot modify order")
end
-- 메타데이터와 함께 확인
local allowed = security.can("delete", "document:" .. doc_id, {
owner_id = doc.owner_id,
department = doc.department
})
| 파라미터 | 타입 | 설명 |
|---|---|---|
action |
string | 확인할 액션 |
resource |
string | 리소스 식별자 |
meta |
table | 추가 메타데이터 (선택적) |
반환: boolean
new_actor
ID와 메타데이터로 새 액터를 생성합니다.
-- 사용자 액터 생성
local actor = security.new_actor("user:" .. user.id, {
role = user.role,
department = user.department,
email = user.email
})
-- 서비스 액터 생성
local service_actor = security.new_actor("service:payment-processor", {
type = "service",
version = "1.0.0"
})
| 파라미터 | 타입 | 설명 |
|---|---|---|
id |
string | 고유 액터 식별자 |
meta |
table | 메타데이터 키-값 쌍 |
반환: Actor
new_scope
새 커스텀 스코프를 생성합니다.
-- 빈 스코프
local scope = security.new_scope()
-- 정책이 있는 스코프
local read_policy = security.policy("app:read-only")
local scope = security.new_scope({read_policy})
-- 점진적으로 스코프 구축
local scope = security.new_scope()
local policy1 = security.policy("app:read")
local policy2 = security.policy("app:write")
scope = scope:with(policy1):with(policy2)
반환: Scope
policy
레지스트리에서 정책을 가져옵니다.
local policy, err = security.policy("app:admin-access")
if err then
return nil, err
end
-- 정책 평가
local result = policy:evaluate(actor, "delete", "user:123")
if result == "allow" then
-- 허용됨
elseif result == "deny" then
-- 거부됨
else
-- 정의되지 않음, 다른 정책 확인
end
| 파라미터 | 타입 | 설명 |
|---|---|---|
id |
string | 정책 ID "namespace:name" |
반환: Policy, error
named_scope
미리 정의된 정책 그룹을 가져옵니다.
-- 관리자 스코프 가져오기
local admin_scope, err = security.named_scope("app:admin")
if err then
return nil, err
end
-- 권한 상승 작업에 사용
local result = admin_scope:evaluate(actor, "delete", "user:123")
| 파라미터 | 타입 | 설명 |
|---|---|---|
id |
string | 정책 그룹 ID |
반환: Scope, error
token_store
인증 토큰 관리를 위한 토큰 스토어를 획득합니다.
local store, err = security.token_store("app:tokens")
if err then
return nil, err
end
-- 스토어 사용...
store:close()
| 파라미터 | 타입 | 설명 |
|---|---|---|
id |
string | 토큰 스토어 ID "namespace:name" |
반환: TokenStore, error
Actor 메서드
| 메서드 | 반환 | 설명 |
|---|---|---|
actor:id() |
string | 액터 식별자 |
actor:meta() |
table | 액터 메타데이터 |
Scope 메서드
with / without
스코프에서 정책을 추가하거나 제거합니다.
local scope = security.new_scope()
-- 정책 추가
local write_policy = security.policy("app:write")
scope = scope:with(write_policy)
-- 정책 제거
scope = scope:without("app:read-only")
evaluate
스코프 내 모든 정책을 평가합니다.
local result = scope:evaluate(actor, "read", "document:123")
-- "allow", "deny", 또는 "undefined"
if result ~= "allow" then
return nil, errors.new("PERMISSION_DENIED", "Access denied")
end
contains
스코프에 정책이 포함되어 있는지 확인합니다.
if scope:contains("app:admin") then
show_admin_features()
end
policies
스코프 내 모든 정책을 반환합니다.
local policies = scope:policies()
for _, policy in ipairs(policies) do
print(policy:id())
end
반환: Policy[]
Policy 메서드
| 메서드 | 반환 | 설명 |
|---|---|---|
policy:id() |
string | 정책 식별자 |
policy:evaluate(actor, action, resource, meta?) |
string | "allow", "deny", 또는 "undefined" |
TokenStore 메서드
create
인증 토큰을 생성합니다.
local actor = security.new_actor("user:123", {role = "user"})
local scope = security.named_scope("app:default")
local token, err = store:create(actor, scope, {
expiration = "24h", -- 또는 밀리초
meta = {
login_ip = request_ip,
user_agent = user_agent
}
})
| 파라미터 | 타입 | 설명 |
|---|---|---|
actor |
Actor | 토큰의 액터 |
scope |
Scope | 권한 스코프 |
options.expiration |
string/number | 기간 문자열 또는 ms |
options.meta |
table | 토큰 메타데이터 |
반환: string, error
validate
토큰을 검증하고 actor/scope를 가져옵니다.
local actor, scope, err = store:validate(token)
if err then
return nil, errors.new("UNAUTHENTICATED", "Invalid token")
end
반환: Actor, Scope, error
revoke
토큰을 무효화합니다.
local ok, err = store:revoke(token)
반환: boolean, error
close
토큰 스토어 리소스를 해제합니다.
store:close()
반환: boolean
권한
보안 작업은 보안 정책 평가 대상입니다.
보안 액션
| 액션 | 리소스 | 설명 |
|---|---|---|
security.policy.get |
정책 ID | 정책 정의 접근 |
security.policy_group.get |
그룹 ID | 명명된 스코프 접근 |
security.scope.create |
custom |
커스텀 스코프 생성 |
security.actor.create |
액터 ID | 액터 생성 |
security.token_store.get |
스토어 ID | 토큰 스토어 접근 |
security.token.validate |
스토어 ID | 토큰 검증 |
security.token.create |
스토어 ID | 토큰 생성 |
security.token.revoke |
스토어 ID | 토큰 폐기 |
정책 설정은 보안 모델을 참조하세요.
에러
| 조건 | 종류 | 재시도 가능 |
|---|---|---|
| 컨텍스트 없음 | errors.INTERNAL |
아니오 |
| 빈 토큰 스토어 ID | errors.INVALID |
아니오 |
| 권한 거부됨 | errors.INVALID |
아니오 |
| 정책을 찾을 수 없음 | errors.INTERNAL |
아니오 |
| 토큰 스토어를 찾을 수 없음 | errors.INTERNAL |
아니오 |
| 토큰 스토어 닫힘 | errors.INTERNAL |
아니오 |
| 잘못된 만료 형식 | errors.INVALID |
아니오 |
| 토큰 검증 실패 | errors.INTERNAL |
아니오 |
local store, err = security.token_store("app:tokens")
if err then
if errors.is(err, errors.INVALID) then
print("Invalid request:", err:message())
end
return nil, err
end
에러 처리는 에러 처리를 참조하세요.