들어가기
Http 방식이 가지는 가장 큰 특징 중 하나는 Stateless(무상태) 이다.
즉 서버는 사용자의 로그인상태를 유지하지 않는다.
이 무상태성을 해결하기위해 여러 방법이 존재하고 이 방법들을 알아보자.
매번 로그인 시키자
맞다. 말도 안되는 방식이고 어떤 서비스도 사용자를 매번 로그인 시키며 피로하게 만들지 않는다.
그렇다면 로그인 정보를 매번 전송하자
로그인 정보를 매번 전송해서 서버에게 나의 로그인 상태를 매번 알리는 방법이다.
그렇다면 어떻게 알리는 방법이 좋을까?
HTTP Body, Query Parameter 혹은 Cookie에 로그인 정보(id,pw)를 담아 전송할 수 있다.
하지만 로그인 정보는 매우 민감한 정보이기 때문에 탈취당한다면 민감한 정보가 유출된다.
위 방식은 어떻게 해서든 클라이언트 측에 로그인 정보를 저장하고 관리해야하는데
클라이언트 측에서 관리하는 방식은 탈취 위험이 크기때문에 선택하기 매우 꺼려진다.
서버에서 Session을 발급하자
서버에서 로그인 요청이 들어오면 임의의 Session ID를 생성하고 Session ID에 대응되는 로그인 정보를 서버측에 저장한다.
Session ID는 클라이언트의 쿠키에 담아 앞으로의 요청에 쿠키를 포함해 요청하도록하면 된다.
Session ID는 무작위 문자열이기에 탈취당한다고 하더라도 직접적인 정보 유출은 없다.
우선 클라이언트 측이 쿠키에 저장한 Session ID를 탈취당하지 않도록 관리가 필요하다.
자바스크립트로 document.cookie 로 쿠키 데이터에 접근할 수 있지만 Http-Only 플래그를 활성화시켜 XSS 공격에 대응할 수 있다.
XSS (Cross Site Script)
XSS공격은 공격자가 원하는 스크립트 문장을 실행시키도록 하는 공격 기법이다.
+ CSRF(Cross Site Request Forgery)
이 공격 방식은 사용자가 이미 로그인 돼 있는 상태를 노린다.
인증된 상태를 이용해 악의적인 행위를 서버에 요청하는 스크립트를 실행시킨다.
자세한 내용은 아래 포스트에 게시했다.
또한 쿠키는 개발자의 실수에 의해 HTTP로 전송되지 않도록 Secure Cookie 설정을 통해 HTTPS 환경에서만 전달되도록 할 수 있다.
HTTPS를 적용한 통신은 패킷을 가로채더라도 패킷은 암호화돼 있어 공격자가 들여다 볼 수 없다.
여러 보안 이슈를 검색해본 결과 HTTPS도 절대 완벽한 방법은 아니다.
TLS/SSL이 적용된 HTTPS도 중간자 공격(MiTM)으로 패킷을 뺏길 우려가 있다.
그럼에도 우리가 할 수 있는 최선은 다 해야한다.
서버의 Session ID 발급은 보안 이슈 외에 더 큰 이슈가 있다.
사용자가 증가하면 그만큼 서버는 인증에 대한 부담이 커진다.
Session을 메모리DB에 올려 사용한다해도 모든 요청에 Session을 조회하고 인증해야한다.
메모리DB를 사용하게되면 서버의 수평적 확장도 어려워진다.
세션 클러스터링으로 수평적 확장을 이뤄내더라도 트래픽 증가에대한 부담은 여전히 존재한다.
서버가 관리하지 않는 상태유지 방법이 필요하다.
'Spring' 카테고리의 다른 글
@Value 감옥에서 벗어나기 [@ConfigurationProperties] (0) | 2024.04.03 |
---|---|
[Spring Security JWT 로그인 (3)] DelegatingFilterProxy Deep Dive (0) | 2024.03.15 |
[Spring Security JWT 로그인 (2)] JWT가 탈취된다면 어떻게 대응해야 할까 (0) | 2024.03.10 |
Redis Session Clustering [세션 고정] (0) | 2023.12.17 |
S3를 이용한 사용자의 고아 이미지 처리 (1) | 2023.12.02 |