"식별"과 "인증"은 보안에서 중요한 두 개념으로, 시스템이나 서비스가 사용자나 기기를 올바르게 구별하고 신뢰할 수 있도록 하는 역할을 합니다.
식별은 사용자가 누구인지를 시스템에 알리는 과정입니다. 식별은 사용자가 시스템에 접속할 때 자신을 "명시"하는 것으로, 계정 아이디, 이메일 주소, 또는 사용자 이름과 같은 식별자를 사용합니다. 이 과정에서는 사용자가 "자신이 누구인지를 밝히는 것"이 중심이며, 시스템은 일단 이를 통해 사용자를 구분해둡니다. 그러나 이 단계에서는 사용자가 말한 식별자가 진짜 사용자와 일치하는지는 확인하지 않으며, 단지 사용자가 어떤 계정에 접근하려고 하는지만 파악하는 것입니다.
- 예시: 이메일 주소 입력, 사용자 이름 입력, 아이디 입력 등.
인증은 식별된 사용자가 정말 그 사용자인지를 확인하는 과정입니다. 이를 통해 사용자가 자신이 주장하는 신원을 증명하도록 하며, 일반적으로 비밀번호, 인증 코드, 생체 정보(지문, 얼굴 인식) 등의 방법을 사용합니다. 인증이 완료되면 시스템은 해당 사용자를 신뢰할 수 있다고 판단하고, 이후 서비스에 접근 권한을 부여합니다.
- 예시: 비밀번호 입력, 2단계 인증 코드 입력, 지문 스캔 등.
쿠키는 웹 서버가 생성하여 웹 브라우저로 전송하는 작은 정보 파일입니다. 웹 브라우저는 수신한 쿠키를 미리 정해진 기간 동안 또는 웹 사이트에서의 사용자 세션 기간 동안 저장합니다. 웹 브라우저는 향후 사용자가 웹 서버에 요청할 때 관련 쿠키를 첨부합니다.
- 세션 쿠키: 세션 쿠키는 웹 사이트에서 사용자의 세션을 추적하는 데 도움이 됩니다. 세션 쿠키는 사용자의 세션이 종료된 후, 즉 사용자가 웹 사이트에서 계정에서 로그아웃하거나 웹 사이트를 종료하면 삭제됩니다. 세션 쿠키는 만료일이 없으므로 세션이 끝나면 삭제되어야 함을 브라우저에 알립니다.
- 영구 쿠키: 세션 쿠키와 달리 영구 쿠키는 하루, 일주일, 몇 달, 심지어 몇 년까지 미리 정해진 기간 동안 사용자의 브라우저에 남아 있습니다. 영구 쿠키에는 항상 만료일이 포함됩니다.
- 인증 쿠키: 인증 쿠키는 사용자 세션을 관리하는 데 도움이 되며, 사용자가 브라우저를 통해 계정에 로그인할 때 생성됩니다. 사용자 계정 정보를 쿠키 식별자 문자열과 연결하여 중요한 정보가 올바른 사용자 세션에 전달되도록 합니다.
- 추적 쿠키: 추적 쿠키는 추적 서비스에서 생성됩니다. 추적 쿠키는 사용자 활동을 기록하고, 브라우저는 다음에 해당 추적 서비스를 사용하는 웹 사이트를 로드할 때 이 기록을 관련 추적 서비스로 전송합니다.
- 좀비 쿠키: 인기 소설의 "좀비"처럼 좀비 쿠키는 삭제된 후 다시 생성됩니다. 좀비 쿠키는 브라우저의 일반적인 쿠키 저장 위치 외부에 자신의 백업 버전을 생성합니다. 이러한 백업을 사용하여 삭제된 후 브라우저에 다시 나타납니다. 좀비 쿠키는 부도덕한 광고 네트워크나 심지어 사이버 공격자들이 사용하기도 합니다.


사용자가 로그인 폼에서 ID와 비밀번호를 입력하고 서버로 요청을 보내면 서버는 클라이언트가 보낸 ID와 비밀번호를 확인하여 유효한 사용자라면 로그인 성공으로 처리 후 사용자에게 고유한 세션 ID를 생성한다. 이 세션 ID는 사용자의 세션 정보를 식별하는 키 역할을 한다. 서버는 HTTP 응답 헤더에 Set-Cookie를 사용해 PHPSESSID와 같은 세션 쿠키를 클라이언트에 전송한다.

클라이언트(브라우저)는 서버로부터 받은 PHPSESSID 쿠키를 저장한다.
이후 사용자가 사이트의 다른 페이지를 요청하면, 브라우저는 PHPSESSID 쿠키를 자동으로 포함하여 서버로 요청을 보내고 서버는 쿠키에 담긴 세션 ID를 사용해 사용자의 로그인 상태를 확인하고, 세션 정보를 기반으로 사용자를 식별한다.
- Set-Cookie: HTTP 응답 헤더로, 서버가 클라이언트에 쿠키를 설정할 때 사용함
PHPSESSID=5jfm1i93ag9cktupuv86ivj7k4
- PHPSESSID는 PHP의 기본 세션 쿠키 이름이고 세션 ID는 사용자별로 고유한 값이며, 여기서는 5jfm1i93ag9cktupuv86ivj7k4이 세션 ID로 설정되어 있다.
- 이 세션 ID는 서버에 저장된 세션 데이터를 식별하는 키로 사용되고 이를 통해 서버는 사용자가 보낸 쿠키를 통해 해당 사용자의 로그인 상태 및 기타 정보를 참조할 수 있다.
path=/
- path=/는 사이트의 모든 경로에서 이 쿠키가 유효함을 의미한다. 따라서 클라이언트는 사이트의 어느 페이지에 접근하든 이 쿠키를 서버에 전송하게 된다.
세션은 서버와 클라이언트 간의 상태 정보를 유지하기 위한 메커니즘입니다. 웹의 특성상 각 요청은 독립적이므로, 사용자의 로그인 상태나 쇼핑 카트 같은 정보를 유지하려면 세션이 필요합니다. 세션은 서버에 저장되며, 로그인 상태, 사용자 정보, 장바구니 아이템 등 사용자의 특정 작업을 저장하여 사용자가 다른 페이지로 이동해도 정보가 유지되도록 합니다.
- 세션의 작동 원리: 사용자가 웹사이트에 접근하면 서버는 새로운 세션을 생성하고, 이 세션에 고유한 식별자인 세션 ID를 부여합니다. 이 세션 ID는 쿠키에 담아 클라이언트에 전송되며, 사용자가 웹사이트를 탐색할 때마다 요청에 이 세션 ID가 포함됩니다.
- 세션의 유효 기간: 세션은 일정 시간 동안 활동이 없거나 사용자가 로그아웃할 때 자동으로 만료됩니다.
세션 ID는 서버가 클라이언트의 세션을 식별할 수 있도록 고유한 문자열을 할당한 값입니다. 사용자가 로그인에 성공하면 서버는 특정 사용자에게 세션을 생성하고, 세션 ID를 생성해 이 ID를 클라이언트에 전달합니다. 세션 ID는 이후의 요청마다 쿠키에 담겨 서버로 전송되며, 이를 통해 서버는 사용자의 상태를 인식할 수 있습니다.
- 세션 ID의 역할: 세션 ID는 세션 데이터를 식별하는 역할을 합니다. 이를 통해 서버는 사용자의 로그인 상태나 기타 정보를 확인할 수 있습니다.
- 보안상의 중요성: 세션 ID는 민감한 정보가 아니지만, 이를 탈취당할 경우 해당 사용자의 세션에 접근할 수 있기 때문에 보안이 중요합니다. HTTPS를 사용하거나 HttpOnly, Secure 옵션을 설정하여 세션 ID가 안전하게 관리되도록 할 수 있습니다.
세션 하이재킹은 공격자가 사용자의 세션 ID를 탈취해 사용자 행세를 하는 공격입니다. 사용자가 로그인한 후 생성된 세션 ID는 사용자의 신원을 대신하기 때문에, 세션 ID가 탈취되면 공격자가 사용자의 세션에 접근할 수 있게 됩니다.
공격 방법
- 네트워크 스니핑: 공격자가 네트워크 트래픽을 도청하여 세션 ID를 가로채는 방법입니다. 특히 HTTP로 접속하는 경우, 세션 ID가 평문으로 전송되므로 노출될 위험이 큽니다.
- 악성 스크립트 삽입 (XSS): 공격자가 웹 페이지에 악성 스크립트를 삽입하여 사용자의 세션 ID를 수집하는 방법입니다.
방어 방법
- HTTPS 사용: 세션 ID가 암호화되어 전송되므로 스니핑을 방지할 수 있습니다.
- HttpOnly 및 Secure 쿠키 설정: 쿠키의 HttpOnly 속성을 사용하면 JavaScript에서 세션 ID에 접근할 수 없게 하여 XSS 공격의 위험을 줄일 수 있습니다.
세션 고정 공격은 사용자가 로그인하기 전에 미리 설정된 세션 ID를 사용하도록 유도하여 공격자가 해당 세션을 탈취하는 방법입니다.
공격 과정
- 공격자가 서버로부터 새로운 세션 ID를 얻습니다.
- 공격자는 피해자가 이 세션 ID를 사용하게 만든 후 로그인하도록 유도합니다.
- 피해자가 로그인하면, 공격자는 동일한 세션 ID를 사용해 로그인된 세션에 접근할 수 있게 됩니다.
방어 방법
- 로그인 후 세션 ID 재발급: 사용자가 로그인할 때마다 새로운 세션 ID를 발급하여 세션 고정 공격을 예방할 수 있습니다.
- 세션 유효성 검사: 세션이 사용자의 IP 주소, 브라우저 정보 등을 기반으로 일치하는지 확인하여 추가적인 보안을 제공할 수 있습니다.
해시는 입력 데이터를 고정된 길이의 문자열로 변환하는 과정을 의미하며, 이를 수행하는 알고리즘을 해시 함수라고 합니다. 해시는 데이터의 무결성을 확인하고, 보안성을 강화하는 데 광범위하게 사용됩니다.
고정 길이 출력
- 해시 함수는 입력 데이터의 크기와 관계없이 항상 일정한 길이의 해시 값을 생성합니다. 예를 들어, SHA-256 해시 함수는 언제나 256비트(32바이트)의 해시 값을 생성합니다.
일방향성
- 해시 함수는 입력 데이터를 해시 값으로 변환할 수 있지만, 그 반대는 불가능합니다. 즉, 해시 값을 통해 원래의 입력 데이터를 역산할 수 없습니다.
충돌 저항성
- 서로 다른 두 입력이 동일한 해시 값을 생성하는 경우를 충돌이라고 합니다. 좋은 해시 함수는 충돌 가능성을 최소화하여, 서로 다른 입력에서 동일한 해시 값이 생성될 확률이 낮습니다.
입력에 대한 민감성
- 입력값이 조금만 변경되어도 완전히 다른 해시 값을 생성해야 합니다. 이 특성은 데이터 변경 여부를 확인하는 데 유용합니다.
데이터 무결성 확인
- 해시 값을 사용하여 파일이나 데이터가 변경되지 않았는지 확인합니다. 원본 데이터의 해시 값을 저장하고, 이후에 다시 계산하여 비교함으로써 무결성을 검증합니다.
비밀번호 저장
- 사용자 비밀번호를 직접 저장하는 대신, 해시 값을 저장하여 보안을 강화합니다. 사용자가 로그인할 때 입력한 비밀번호를 해시하여 저장된 해시 값과 비교합니다.
디지털 서명
- 문서의 출처와 무결성을 보장하기 위해 해시 값을 생성하고, 이를 암호화하여 디지털 서명을 만듭니다.
데이터베이스 인덱스
- 해시 테이블에서 데이터를 효율적으로 검색하기 위해 해시 값을 사용합니다. 이를 통해 빠른 데이터 조회가 가능합니다.
고정된 길이 문제
- 설명: 해시는 고정된 길이의 출력 값을 생성하기 때문에, 입력 데이터가 아무리 길거나 복잡해도 출력의 길이는 변하지 않습니다.
- 위험성: 입력 데이터가 길어질수록 해시 값의 충돌 가능성이 증가할 수 있습니다. 이는 해시 함수를 안전하게 유지하는 데 어려움을 줄 수 있습니다.
불완전한 해시 함수 사용
- 설명: 잘못된 또는 안전하지 않은 해시 함수를 사용할 경우 보안이 취약해질 수 있습니다.
- 위험성: SHA-1과 같은 오래된 해시 함수는 충돌 공격에 취약하므로, 이를 사용하면 보안이 크게 저하될 수 있습니다. 최신의 안전한 해시 함수를 사용해야 합니다.
사전 공격 (Pre-image Attack)
- 설명: 공격자가 주어진 해시 값에 대해 해당 해시 값을 생성하는 원본 입력 데이터를 찾아내려는 시도입니다.
- 위험성: 해시 함수가 안전하지 않으면, 공격자는 해시 값에 대응하는 입력 값을 쉽게 찾을 수 있습니다. 이는 비밀번호나 인증 정보의 해시 값이 노출되었을 때 큰 위험이 될 수 있습니다.
이차 사전 공격 (Second Pre-image Attack)
- 설명: 공격자가 특정 입력 값에 대해 동일한 해시 값을 생성하는 또 다른 입력 값을 찾으려는 공격입니다.
- 위험성: 공격자는 한 데이터에 대한 해시 값을 알고 있을 때, 이를 기반으로 동일한 해시 값을 가지는 다른 데이터를 생성할 수 있습니다. 이는 특정 데이터의 신뢰성을 저하시킬 수 있습니다.

비밀번호 12345678! 로 회원가입

해시된 비밀번호로 데이터 저장

PASSWORD_DEFAULT를 이용 PASSWORD_DEFAULT는 PHP에서 현재 가장 안전한 해시 알고리즘을 자동으로 선택하여 비밀번호를 해시