Search

세션과 토큰

목차

세션과 토큰이란 무엇인가?

세션(Session)의 정의와 역할
세션은 사용자가 서버에 로그인할 때, 서버 측에 저장되는 사용자 정보의 임시 저장소이다. 세션을 통해 사용자가 로그인된 상태를 유지할 수 있다. 예를 들어, 사용자가 로그인을 하면 서버는 세션 ID를 생성하고 이를 통해 해당 사용자가 로그인한 상태를 인식하게 된다.
토큰(Token)의 정의와 역할
토큰은 로그인 시 서버에서 발급되는 특정한 데이터로, 사용자의 인증 정보를 포함하고 있다. 주로 클라이언트 측에서 상태를 유지하는 방식으로 사용된다. 토큰은 JWT(JSON Web Token)나 OAuth와 같은 표준을 기반으로 한다.
왜 세션과 토큰을 사용하는가?
사용자 인증은 보안편리성을 제공하기 위해 필요하다. 세션과 토큰은 각각의 방식으로 사용자를 인증하고 권한을 부여하는데 각각의 장단점이 있기 때문에 상황에 따라 적절한 방식을 선택하는 것이 중요하다.

세션 기반 인증의 작동 원리

세션 기반 인증의 개념
세션 기반 인증에서는 서버가 상태를 저장하는 방식이다. 사용자가 로그인하면 서버에서 세션을 생성하고 클라이언트는 세션 ID를 쿠키에 저장해 서버에 보낸다. 서버는 세션 ID를 통해 사용자의 로그인 상태를 확인한다.
세션 ID 생성 및 관리
세션 ID는 사용자가 로그인할 때 서버에서 생성되는 고유한 문자열이다. 서버는 이 ID를 통해 클라이언트와의 연결 상태를 유지한다.
세션 저장 위치
세션 정보는 서버 측 저장소에 저장된다. 주로 Redis와 같은 메모리 캐시나 데이터베이스에 저장된다.
세션을 통한 인증 흐름 예시
1.
사용자가 로그인 정보 입력
2.
서버는 로그인 정보를 확인한 후 세션을 생성하고 세션 ID를 클라이언트에 보냄
3.
클라이언트는 세션 ID를 쿠키에 저장하고 이후 요청마다 세션 ID를 서버로 전송
4.
서버는 세션 ID를 통해 사용자가 인증된 상태인지 확인
세션 만료 및 갱신 방법
세션은 일정 시간이 지나면 만료된다. 이 경우 사용자는 다시 로그인해야 한다. 세션 갱신은 클라이언트가 만료 전에 갱신 요청을 통해 연장할 수 있다.

토큰 기반 인증의 작동 원리

토큰 기반 인증의 개념
토큰 기반 인증은 클라이언트가 토큰을 통해 상태를 유지하는 방식이다. 서버는 토큰을 생성하여 클라이언트에 제공하며 클라이언트는 이를 저장하고 이후 요청 시마다 전송하여 인증을 확인받는다.
토큰의 종류 (JWT, OAuth)
JWT (JSON Web Token): JSON 형식으로 인코딩된 토큰으로, 사용자 정보와 만료 시간을 포함한다.
OAuth: 인증 프로토콜로, 소셜 로그인 같은 외부 서비스 인증에도 사용된다.

토큰 발급 및 저장 위치

토큰은 클라이언트가 직접 관리하며 일반적으로 로컬 저장소(Local Storage)보안 쿠키에 저장된다.

토큰을 통한 인증 흐름 예시

1.
사용자가 로그인 정보 입력
2.
서버는 로그인 정보를 확인한 후 토큰을 생성해 클라이언트에 전달
3.
클라이언트는 토큰을 로컬 저장소에 저장하고 이후 요청마다 토큰을 서버에 전송
4.
서버는 토큰을 검증하여 사용자의 인증 상태를 확인
토큰 만료 및 갱신 방법
토큰은 만료 시간이 설정되어 있으며 주기적으로 재발급을 받아야 힌다. 일반적으로 리프레시 토큰을 통해 만료된 토큰을 갱신한다.

세션과 토큰의 차이점 비교

구분
세션 기반 인증
토큰 기반 인증
상태 관리
서버에 상태 저장
클라이언트에 상태 저장
서버 부하
서버가 세션을 저장하므로 부하가 커질 수 있음
서버 부담이 적음
확장성
서버 간 세션 공유 필요
확장성이 좋음
보안 리스크
세션 탈취에 대한 위험
토큰 탈취 위험, 추가적인 보안 필요
모바일 적합성
웹 환경에서 주로 사용
모바일 및 웹 모두 적합

세션과 토큰 관리 시 주의할 점

사용자 인증 데이터 보안 유지 방법
민감한 데이터는 Keychain에 안전하게 저장하고 네트워크 통신 시 HTTPS를 사용한다.
세션과 토큰 만료에 따른 자동 로그아웃 구현
만료 시간을 체크하여 자동 로그아웃을 구현한다.
네트워크 오류 및 갱신 실패에 대한 예외 처리 방법
네트워크 연결 오류 시 재시도 로직을 구현하고 갱신 실패 시 사용자에게 안내한다.

JWT (JSON Web Token)

JWT는 JSON Web Token의 약자로, 인증된 사용자 정보를 포함하는 JSON 기반의 토큰이다. 사용자가 서버에 로그인하면 서버는 이 토큰을 생성하여 클라이언트에 전달하며 이후 요청마다 이 토큰을 사용하여 서버는 사용자의 신원을 확인할 수 있다. JWT는 사용자 상태를 서버가 아닌 클라이언트가 관리하는 방식으로, 특히 확장성이 뛰어난 인증 방식으로 알려져 있다.
JWT는 크게 Header(헤더), Payload(페이로드), Signature(서명)의 세 부분으로 구성된다.
Header
JWT의 타입(JWT)과 해싱 알고리즘을 지정하는 부분이다.
Payload
토큰의 본문으로 사용자 정보나 만료 시간 같은 데이터를 JSON 객체로 저장한다.
Signature
Header와 Payload를 합친 후 서버 비밀 키로 서명하여 생성한다. 이 서명을 통해 데이터의 무결성을 보장할 수 있다.

JWT 인증 흐름

1.
사용자가 로그인하면 서버는 사용자 인증 후 JWT를 생성하여 클라이언트에 전달한다.
2.
클라이언트는 이 JWT를 로컬 저장소에 저장하고 이후 서버에 요청을 보낼 때마다 JWT를 함께 보낸다.
3.
서버는 JWT의 서명을 검증하여 사용자의 인증 상태를 확인하고 유효한 토큰인 경우 요청을 처리한다.

JWT의 장점

확장성
서버가 상태를 저장할 필요가 없으므로 확장성이 뛰어난다.
서버 부하 감소
클라이언트가 토큰을 관리하므로 상태를 서버가 직접 저장하지 않아 서버의 부하가 줄어든다.

JWT의 단점 및 주의 사항

보안 위험
클라이언트에 저장된 토큰이 탈취될 경우 인증된 상태로 악용될 위험이 있다. 이를 방지하기 위해 HTTPS를 사용하고 짧은 만료 시간을 설정한다.
토큰 갱신 필요
JWT는 만료 시간이 있으므로 만료 후에는 리프레시 토큰을 사용하여 재발급 받는 로직이 필요하다.

Interceptor란?

Interceptor는 네트워크 요청을 가로채어 전처리하거나 응답을 후처리할 수 있는 기능이다. iOS에서 Interceptor는 주로 Alamofire와 같은 네트워크 라이브러리에서 지원되며 이를 통해 인증과 관련된 작업을 자동화할 수 있다.
Interceptor는 JWT와 함께 사용하여 모든 요청에 자동으로 JWT를 추가하거나 토큰 만료 시 자동 갱신하는 로직을 구현하는 데 매우 유용하다.
Interceptor의 주요 역할
Adapt
네트워크 요청을 보내기 전, 요청 헤더에 자동으로 토큰을 추가하는 작업을 수행한다.
Retry
토큰이 만료된 경우(401 오류 등), 자동으로 리프레시 토큰을 사용하여 액세스 토큰을 갱신하고 실패했던 요청을 다시 시도하게 한다.

Interceptor와 JWT 결합의 장점

토큰 관리 자동화
Interceptor가 모든 요청에 대해 자동으로 토큰을 추가하고 만료 시 갱신하는 등 작업을 수행하여 코드의 간결성과 유지보수성을 높인다.
보안 강화
토큰 갱신 로직을 Interceptor에 통합하면 보안성과 사용자 경험을 모두 개선할 수 있다.