세션 관리
IT 위키
더 많은 작업
- Session Management
- 사용자와 시스템 사이, 또는 시스템 간에 활성화된 접속(세션)을 생성·유지·종료하는 보안 기능
HTTP 처럼 상태가 없는 프로토콜에서 '누가 로그인해 있는가'를 이어 가려면 세션이 필요하고, 그 세션 자체가 공격 대상이 된다.
| 기능 | 하는 일 |
|---|---|
| 계정과 패스워드 관리 | 사용자를 식별하고 인증한다 |
| 세션 관리 | 인증된 뒤의 활성 접속을 관리한다 |
| 파일 관리 | 파일 접근 권한을 통제한다 |
| 로그 관리 | 행위를 기록한다 |
| 취약점 관리 | 패치와 설정을 점검한다 |
웹의 세션은 서버가 사용자별 상태를 저장하고, 클라이언트에는 그 상태를 찾아갈 세션 ID 만 쿠키로 준다.
| 구분 | 세션 | 쿠키 |
|---|---|---|
| 저장 위치 | 서버 | 클라이언트(브라우저) |
| 클라이언트가 가진 것 | 세션 ID 하나 | 값 자체 |
| 보안 | 값이 서버에 있어 상대적으로 안전 | 사용자가 보고 고칠 수 있다 |
- 요청에 세션 ID 가 없거나 만료된 ID 면 서버가 새 세션을 만들고 ID 를 발행해 쿠키로 내려 준다.
- 세션은 서버에 있지만 클라이언트도 로그아웃 요청으로 종료시킬 수 있다. 서버는 그때 세션을 파기한다.
- 세션 타임아웃은 일정 시간 요청이 없을 때 서버가 세션을 자동으로 끝내는 시간이다.
- 세션 값을 클라이언트에 맡기면 사용자가 그 값을 바꿀 수 있으므로 세션의 의미가 없어진다. 세션 값은 서버에만 두고, 클라이언트에는 추측할 수 없는 ID 만 준다.
- 세션 하이재킹 방지 — 예측 불가능한 난수로 세션 ID 생성, 충분한 길이(128비트 이상)
- 전송 보호 — HTTPS 강제, 쿠키에 `Secure` · `HttpOnly` · `SameSite` 속성 부여
- 세션 고정(Session Fixation) 방지 — 로그인 성공 시 세션 ID 를 새로 발급한다
- 타임아웃 — 일정 시간 입력이 없으면 세션을 끊는다. 절대 만료 시간도 둔다
- 정상 종료 — 로그아웃 시 서버 측 세션을 실제로 파기한다. 쿠키만 지우는 것으로는 부족하다
- 동시 접속 통제 — 같은 계정의 중복 로그인을 제한하거나 이전 세션을 끊는다
- 중요한 거래 전 재인증
쿠키나 세션 값을 조작해 다른 사용자로 행세하는 공격(쿠키/세션 위조)을 막는 방법이다.
- 세션 관리 정보는 모두 서버 측에 저장·관리한다. 클라이언트에는 추측할 수 없는 세션 ID 만 준다
- 중요한 기능에는 SMS 인증·OTP 같은 2차 인증을 더한다
- 쿠키 값은 사용자가 바꿀 수 있는 불완전한 정보이므로, 쿠키에 꼭 담아야 할 값은 암호화하고 서명(HMAC)을 붙여 변조를 확인한다 → 쿠키
- 세션 ID 는 로그인 때마다 새로 발급하고 일정 시간 뒤 만료시킨다
- 입력값을 검증해 SQL 을 주입하는 SQL 인젝션, 스크립트를 심는 크로스사이트 스크립트와는 대응 방법이 다르다