세션 데이터 액세스

GitLab의 세션 데이터는 Redis에 저장되며 여러 가지 방법으로 액세스할 수 있습니다.

예를 들어 웹 요청 중에:

  • Rails는 ActionDispatch::Session을 통해 컨트롤러 내에서 세션에 액세스할 수 있습니다.
  • 컨트롤러 외부에서는 Gitlab::Session을 통해 세션에 액세스할 수 있습니다.

웹 요청 이외의 경우에도 Redis에 저장된 세션에 액세스할 수 있습니다. 예를 들어:

  • 세션 ID 및 내용은 Redis에서 직접 조회할 수 있습니다. (#redis).
  • 세션과 관련된 UserAgent에 대한 데이터는 ActiveSession을 통해 액세스할 수 있습니다.

세션에 값 저장 시 가장 좋은 방법은:

  • 복잡한 marshaling을 피하기 위해 간단한 원시 자료형을 사용하고 객체를 저장하지 않습니다.
  • 필요하지 않은 변수를 정리하여 Redis의 메모리 사용량을 줄입니다.

GitLab::Session

가끔은 세션에 데이터를 영속적으로 저장하고 싶을 때가 있습니다. Gitlab::Session을 사용하면 세션을 여러 곳으로 전달하지 않고도 액세스할 수 있습니다. 예를 들어, 권한이 확인되는 모든 곳에 세션을 전달할 필요 없이 정책 내에서 액세스할 수 있습니다.

세션은 컨트롤러에서 사용할 때와 마찬가지로 해시 형식의 인터페이스를 갖습니다. 또한, 해시에 키-값 데이터를 저장하기 위한 NamespacedSessionStore도 있습니다.

# 현재 세션에 저장된 값 조회
Gitlab::Session.current[:my_feature]

# Redis에 저장된 현재 세션 수정
Gitlab::Session.current[:my_feature] = value

# 키 아래에 네임스페이스 지정된 키-값 데이터 저장
Gitlab::NamespacedSessionStore.new(:my_feature)[some_key] = value

# 테스트용으로 세션 설정
Gitlab::Session.with_session(my_feature: value) do
  # Session.current[:my_feature]을 사용하는 코드
end

Redis

세션 데이터는 직접적으로 Redis를 통해 액세스할 수 있습니다. 이를 통해 디버깅할 때 브라우저 세션을 확인할 수 있습니다.

# 세션 목록 가져오기
session_ids = Gitlab::Redis::Sessions.with do |redis|
  redis.smembers("#{Gitlab::Redis::Sessions::USER_SESSIONS_LOOKUP_NAMESPACE}:#{user.id}")
end

# 특정 세션 검색
session_data = Gitlab::Redis::Sessions.with { |redis| redis.get("#{Gitlab::Redis::Sessions::SESSION_NAMESPACE}:#{session_id}") }
Marshal.load(session_data)

ActiveSession으로 장치 정보 가져오기

사용자 프로필의 Active Sessions 페이지는 각 세션에 액세스하는 기기에 대한 정보를 표시합니다. 해당 페이지에서 세션 목록을 나열하는 데 사용된 방법은 개발에도 유용할 수 있습니다.

# 특정 사용자의 세션 목록 가져오기
# session_id 및 UserAgent에서 가져온 데이터 포함
ActiveSession.list(user)