세션 데이터 접근
GitLab의 세션 데이터는 Redis에 저장되어 다양한 방법으로 액세스할 수 있습니다.
예를 들어, 웹 요청 중:
- Rails는
ActionDispatch::Session
을 통해 컨트롤러 내에서 세션에 액세스할 수 있습니다. - 컨트롤러 외부에서도
Gitlab::Session
을 통해 세션에 액세스할 수 있습니다.
웹 요청이 아닌 경우에도 Redis에 저장된 세션에 액세스할 수 있습니다. 예를 들어:
- 세션 ID와 내용은 직접 Redis에서 조회할 수 있습니다.
- 세션과 연결된 UserAgent에 대한 데이터는
ActiveSession
을 통해 액세스할 수 있습니다.
세션에 값을 저장할 때는 다음을 권장합니다:
- 복잡성을 피하기 위해 단순한 원시 유형을 사용하고 객체를 저장하지 않습니다.
- 메모리 사용량을 줄이기 위해 필요하지 않은 변수를 정리합니다.
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)