> For the complete documentation index, see [llms.txt](https://docs.axuslab.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.axuslab.com/1.-common-structures/session.md).

# 세션 - Session

Session

#### 설명

Axs는 **IAxsSession** 인터페이스를 제공하여 ASP.NET의 **세션을 사용하지 않고**도 현재 사용자와 테넌트를 얻을 수 있습니다. IAxsSession은 권한 부여([authorization](https://github.com/axuslab/docs.axs/blob/main/Developments/Authorization/README.md)) 시스템과 같은 Axs의 다른 구조에서 완전히 통합되어 사용할 수 있습니다.

#### Injecting Session

IAxsSession은 일반적으로 세션 정보 없이는 동작 할 수 없는 경우 필요한 클래스에 속성이 주입([**property injected**](https://github.com/axuslab/docs.axs/blob/main/Developments/Dependency_Injection/README.md#property-injection-pattern))됩니다. 속성 주입을 사용하는 경우 아래와 같이 **NullAxsSession.Instance**를 기본값으로 사용할 수 있습니다 :

```csharp
public class MySampleClass : ITransient
{
    public IAxsSession AxsSession { get; set; }

    public MySampleClass()
    {
        // Null세션객체를 임시로 할당하고, 추후 원래 객체로 DI해 준다.
        AxsSession = NullAxsSession.Instance;
    }

    public void MyMethod()
    {
        // 세션에서 갑 가져오기
        var currentUserId = AxsSession.UserId;
        //...
    }
}
```

인증 / 권한은 애플리케이션 계층 작업이므로 **애플리케이션 계층과 상위 계층에서 IAxsSession을 사용**하는 것이 좋습니다. 이것은 일반적으로 도메인 계층에서 수행되지 않습니다. **AppController**, **AxsController**, **AxsApiController** 및 일부 기타 기본 클래스에는 **AxsSession**이 이미 삽입되어 있으므로 메서드에서 AxsSession 속성을 사용할 수 있습니다.

#### Session Properties

AxsSession은 몇 가지 주요 속성을 정의합니다

* **UserId** : 현재 사용자의 ID 또는 로그인이 안된경우 null입니다.
* **TenantId** : 현재 테넌트의 ID 또는 현재 테넌트가 없는 경우 null입니다 (사용자가 로그인하지 않았거나 호스트 사용자 인 경우 null입니다).

UserId 및 TenantId는 **nullable**입니다. nullable이 아닌 **GetUserId()** 및 **GetTenantId()** 메서드도 있습니다. 현재 사용자가 있다고 확신하는 경우 GetUserId()를 호출 할 수 있습니다. 현재 사용자가 null 인 경우 에러가 발생합니다. GetTenantId()도 이런 방식으로 동작합니다.

#### 세션값 범위 변경

일부 특정 시나리오의 경우에는 제한된 범위에 대해 세션 값을 변경 또는 무시해야 할 수 있습니다. 이러한 경우 아래와 같이 IAxsSession.Use 메서드를 사용할 수 있습니다.

```csharp
public class MyService
{
    private readonly IAxsSession _session;

    public MyService(IAxsSession session)
    {
        _session = session;
    }

    public void Test()
    {
        // 세션값을 42번으로 지정한다.
        // 실제 로그인한 사용자와 다르게 지정할 수 있습니다.
        using (_session.Use(42, null))
        {
            var tenantId = _session.TenantId; //42
            var userId = _session.UserId; //null
        }
    }
}
```

Use 메서드는 IDisposable을 반환하며 **삭제해야**합니다. 반환 값이 삭제되면 세션 값은 **자동으로 이전** 값으로 복원됩니다.

**주의!**

위와 같이 using 블록에서 Use 메서드를 사용하는 것을 권고 드립니다.

#### 확인

swagger에서 확인 디버그 모드에서 로그인 후 CallMySampleClass를 호출해서 세션이 동작하는 지를 확인할 수 있다.

![picture 1](https://973433021-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F35tSm8dhwtRBSQhjeoCu%2Fuploads%2Fgit-blob-3d5c469ed9e5a8ebf284fac011987135259d528f%2Fc6f1ad9bd360d0d5ff0f76d00aae8b6b4ee0f17886c2b96164a3a255bac659a1.png?alt=media)

브레이크 포인트를 걸어서 로그인 후 확인 해 보면 AxsSession.UserId에 값이 들언온 것을 확인할 수 있다.

![picture 2](https://973433021-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F35tSm8dhwtRBSQhjeoCu%2Fuploads%2Fgit-blob-a05147080a4c544cb2696878e0984de9548e9fab%2Ffba396459c0c1568ac249aa4801fa075b33c37a309b74ea9b535479cd85d2d2b.png?alt=media)

Use를 사용해서 using 범위로 테넌트와 사용자를 변경을 확인 할 수 있습니다.

![picture 3](https://973433021-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F35tSm8dhwtRBSQhjeoCu%2Fuploads%2Fgit-blob-7375c8f583e58a2fe2e7715dd4c7c3e986f6eb96%2F2179b335f79e38495fa93a0df210a5e231ec523e12925e7c7682cdc8e1e90d1a.png?alt=media)
