Hyperlambda 엔드포인트 보안 및 캐싱

이 기사에서 우리는 첫 번째 매뉴얼을 만든 이전 기사에서 수행한 작업을 기반으로 합니다. 이 문서에는 아래에서 찾을 수 있는 관련 YouTube 비디오도 있습니다.



Magic의 보안 및 JWT 토큰



Magic은 JWT를 기반으로 합니다. JWT는 인증 및 승인을 위한 개방형 표준입니다. JWT에 대한 자세한 내용은 JWT.io에서 확인할 수 있습니다. JWT 토큰은 "투명한 인증 토큰"이라고 합니다. 이는 사용자 이름, 역할 및 사용자와 관련된 기타 클레임과 같은 항목을 보기 위해 프런트엔드에서 의미론적으로 구문 분석할 수 있음을 의미합니다. 이후 기사에서는 사용자를 인증하기 위해 Magic에서 JWT 토큰을 생성하는 방법을 살펴보겠지만 지금은 승인된 사용자만 호출할 수 있도록 Hyperlambda 엔드포인트를 보호하는 방법을 이해하는 것으로 충분합니다.

사용자가 하나 이상의 역할에 속하도록 요구하려면 일반적으로 [auth.ticket.verify] 슬롯을 사용합니다. 이 슬롯은 호출에 대한 인수로 전달하는 쉼표로 구분된 역할 중 하나에 사용자가 속하지 않는 한 단순히 예외를 발생시킵니다. 아래는 귀하의 편의를 위해 위의 비디오에서 시작한 코드입니다.

.arguments
   genre:string

// This line throws unless user belongs to root or admin role
auth.ticket.verify:root, admin

sqlite.connect:chinook

   sqlite.select:@"select distinct c.Email, c.FirstName, c.LastName, g.name
  from Customer c
    inner join Invoice i on c.CustomerId = i.CustomerId
    inner join InvoiceLine ii on i.InvoiceId = ii.InvoiceId
    inner join Track t ON ii.TrackId = t.TrackId
    inner join Genre g ON t.GenreId = g.GenreId
  where g.Name = @genre
  order by c.Email"
      @genre:x:@.arguments/*/genre

   return:x:-/*


이전 기사에서 Hyperlambda 파일을 수정하고 해당 내용을 위와 교환하고 시크릿 브라우저 창에서 엔드포인트를 호출하려고 하면 "액세스 거부"라는 401 오류가 표시됩니다. 브라우저가 올바른 JWT 토큰을 요청과 연결하지 않기 때문입니다.

이렇게 하면 "역할 기반 액세스 제어"를 의미하는 끝점에 적용RBAC하여 끝점을 호출할 수 있는 액세스 권한을 가진 사람을 제어할 수 있습니다. RBAC는 애플리케이션에 액세스할 수 있는 사람을 제어하기 위한 잘 알려진 인증 메커니즘이며, 물론 Magic에서 사용자와 역할을 관리하는 것은 매우 쉽습니다. 아래는 Magic 대시보드에서 역할에 사용자를 추가하는 스크린샷입니다.



사용자는 하나 이상의 역할에 속할 수 있으며 하나 이상의 역할에 속하는 사용자를 제외한 모든 사용자에 대해 각 엔드포인트를 잠글 수 있습니다. 이 패턴을 사용하면 서버에서 어떤 엔드포인트를 호출할 수 있는 액세스 권한을 가진 사용자를 쉽게 제어할 수 있습니다.

캐싱 및 HTTP 응답 개체



위 비디오의 마지막 부분에서는 클라이언트에 다시 반환되는 HTTP 헤더를 추가하는 방법을 살펴봅니다. 특히 Cache-Control HTTP 헤더를 적용하여 클라이언트가 "n 시간(초)"동안 응답 개체를 캐시할 수 있도록 합니다. 동일한 QUERY 매개변수가 주어지면 결과가 거의 변경되지 않는 엔드포인트의 경우 이는 최적화 측면에서 손쉬운 승리이며 애플리케이션이 훨씬 더 빨라지고 프런트엔드가 훨씬 더 빠르게 응답하게 됩니다. 미리 정의된 시간 동안 결과를 얻습니다. 아래에서 캐시를 적용하는 데 사용하는 전체 코드를 찾을 수 있습니다.

.arguments
   genre:string

auth.ticket.verify:root, admin

// This line of code will cache your response for 200 seconds
response.headers.set
   Cache-Control:private, max-age=200

sqlite.connect:chinook

   sqlite.select:@"select distinct c.Email, c.FirstName, c.LastName, g.name
  from Customer c
    inner join Invoice i on c.CustomerId = i.CustomerId
    inner join InvoiceLine ii on i.InvoiceId = ii.InvoiceId
    inner join Track t ON ii.TrackId = t.TrackId
    inner join Genre g ON t.GenreId = g.GenreId
  where g.Name = @genre
  order by c.Email"
      @genre:x:@.arguments/*/genre

   return:x:-/*


유효성 검사기



유효성 검사기는 "재사용 가능한 비즈니스 규칙 구성 요소"와 비슷하며 Magic에는 이메일 주소, 정수, 날짜 및 시간 개체 등과 같이 상상할 수 있는 대부분의 항목에 대한 서버 측 유효성 검사기가 있습니다. 일반적으로 하나의 라이너입니다. Hyperlambda에 쉽게 적용할 수 있습니다. 아래는 [foo] 정수 인수에 유효성 검사기를 적용하는 YouTube 비디오의 예제 코드입니다.

.arguments
   genre:string
   foo:int

auth.ticket.verify:root, admin

// This makes the genre argument mandatory.
validators.mandatory:x:@.arguments/*/genre

// This ensure the [foo] argument is between 100 and 200
validators.integer:x:@.arguments/*/foo
   min:100
   max:200

response.headers.set
   Cache-Control:private, max-age=200

sqlite.connect:chinook

   sqlite.select:@"select distinct c.Email, c.FirstName, c.LastName, g.name
  from Customer c
    inner join Invoice i on c.CustomerId = i.CustomerId
    inner join InvoiceLine ii on i.InvoiceId = ii.InvoiceId
    inner join Track t ON ii.TrackId = t.TrackId
    inner join Genre g ON t.GenreId = g.GenreId
  where g.Name = @genre
  order by c.Email"
      @genre:x:@.arguments/*/genre

   return:x:-/*


[장르]는 필수이지만 [foo]는 필수가 아닌 위의 미묘한 부분에 주목하십시오. 그러나 [foo]가 주어지면 100에서 200 사이의 값을 가져야 합니다. [foo] 인수도 필수가 되도록 하려면 필수 유효성 검사기를 추가해야 합니다.

이후 기사에서는 Hyperlambda 유효성 검사기에 대해 자세히 알아볼 것입니다.

좋은 웹페이지 즐겨찾기