1주차부터 로그인 페이지를 제작하며 계속 기능을 추가하고 있다.
웹 브라우저에서 서비스를 사용하기 위해 로그인을 하는데, 여러 페이지를 해당 권한으로 계속 사용하기 위해 로그인 상태를 계속 유지할 수 있는 방법에 대한 게시글이다.
HTTP Protocol (Hypertext Transfer Protocol)
인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다.
웹 브라우저에서 클라이언트가 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)한다. HTTP의 작동 방식은 Connectless인데, 이는 서버에 연결 요청에 응답을 받으면 연결을 끊는다는 뜻이다. 즉, 클라이언트의 이전 상태를 알 수가 없다.
- Connectless: 클라이언트가 요청을 한 후, 응답을 받으면 그 연결을 끊어버리는 특성
- Stateless: 통신이 끝나면 상태를 유지하지 않는 특징
이를 보완하기 위해 HTTP는 쿠키와 세션을 발급하여 문제를 해결한다.
쿠키(Cookie)란?
클라이언트 측에 저장되는 작은 데이터 조각이다. 간단히 말해 쿠키 = 로그인 요청서 + 내 정보 이다.
사용자가 웹 사이트를 방문할 때마다 서버에 전송된다. 이를 통해 사용자의 선호, 로그인 상태 등을 기억하여 사용자 경험 개선에 사용한다.
예) 팝업 '더 이상 열지 않음' 체크 설정, 쇼핑몰 장바구니, 로그인 정보 저장 등
- 사용자 인증이 유효한 시간을 명시할 수 있음 (유효 시간 정해지면 브라우저 종료되어도 인증 유지)
- 쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조
- 사용자가 따로 요청하지 않아도 브라우저가 request 시 request header를 넣어 자동으로 서버에 전송 가능
동작 과정
- 클라이언트가 페이지 요청
- 서버에서 쿠키 생성
- HTTP 헤더에 쿠키 포함시켜 응답
- 브라우저 종료되어도 쿠키 만료 기간에 따라 클라이언트에서 보관
- 동일 요청 들어올 시, HTTP 헤더에 쿠키 함께 전송
- 서버에서 쿠키 읽고 필요 시 정보 업데이트 후 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
단, 쿠키는 마음대로 변조가 가능하다. 클라이언트 측에 저장되므로 사용자가 직접 수정하여 원하는대로 쿠키 값을 보낼 수 있다. 따라서 중요한 정보는 쿠키에 저장하지 말고, 서버에서 세션으로 관리해야 한다.
세션(Session)이란?
서버 측에 저장하는 데이터(사용자 정보)로, 데이터는 (서버 구현 방식에 따라) 서버의 메모리, 데이터베이스, 또는 파일 시스템에 저장된다.
서버는 각 클라이언트에 고유 세션 ID를 할당한다. 세션 ID는 클라이언트(세션 정보)를 구분하기 위한 데이터로, 쿠키에 들어가서 관리된다. (세션 ID는 보안이 중요하므로 HTTPS를 통해 전송하는 것이 좋음, 중간자 공격 방지 위함)
- Session ID: 클라이언트가 request 보내면 해당 서버의 엔진이 클라이언트에게 부여하는 유일한 ID
세션 ID를 통해 사용자의 상태를 관리하고, 쿠키에 비해 보안성이 높은 정보를 저장할 수 있다. 단, 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다.
동작 과정
- 클라이언트가 서버 접속 시 세션ID 발급
- 클라이언트는 세션ID에 대해 쿠키를 사용하여 저장 및 보유
- 클라이언트는 서버에 요청 시, 쿠키의 세션ID를 같이 서버에 전달하여 요청
- 서버가 세션ID를 전달 받아 세션에 있는 클라이언트 정보를 세션ID를 사용해서 가져온 후 사용
- 클라이언트 정보를 통해 서버 요청 처리하고 클라이언트에게 응답
|
쿠키 (Cookie)
|
세션 (Session)
|
데이터 저장 위치
|
클라이언트 측의 웹 브라우저
|
서버
|
설계 목적
|
사용자의 브라우저를 통해
서버와 데이터를 주고 받기 위함
|
서버에서 사용자의 상태를
(일시적으로) 유지하기 위함
|
만료 기한
|
사용자가 직접 삭제하기 전까지
|
서버에서 사용자가 로그아웃하거나 브라우저를 닫기 전까지
또는 설정된 만료 시간 종료 전까지
|
세션 ID도 클라이언트 측에서 쿠키로 관리되므로 변조가 가능하다. 세션 ID가 탈취되는 경우, 공격자가 사용자의 계정에 접근할 수 있다. (XSS, 세션 하이재킹 등을 통해 발생할 수 있음)
이를 보완하기 위한 관리 방법은 다음과 같다.
- ID를 랜덤하고 복잡한 문자열로 생성하여 유추가 불가능하도록 관리
- 로그인할 때마다 새로운 세션 ID 부여 (ID 재사용 방지, 재로그인하면 이전 세션 ID는 파기됨)
사이트마다 세션 ID와 쿠키는 전부 독립적으로 관리된다. 사이트 간 세션 ID는 서로 영향을 미치지 않으며, 각각의 보안 정책에 따라 다르게 관리된다.
'모의해킹 > 웹해킹스터디' 카테고리의 다른 글
JavaScript 기초 문법 다지기 및 키로거 만들기 (0) | 2024.11.29 |
---|---|
Burp Suite 사용법 (0) | 2024.11.27 |
[실습] 4개 로직 반영한 로그인 페이지 만들기 (0) | 2024.11.27 |
로그인 로직 이해하기 - 식별과 인증, 그리고 해시 (Hash) (1) | 2024.11.27 |
[실습] 회원가입 페이지 만들기 + DB연동 (0) | 2024.11.27 |