클라이언트와 서버의 연결정보를 세션이라고 한다.
서버는 세션을 메모리에 저장하여 관리한다.
Http의 일종으로, 사용자가 웹사이트를 방문할 경우 해당 사이트가 사용하는 서버에서 사용자의 컴퓨터에 저장하는 기록 정보 파일(text)이다.
스프링 시큐리티로 인증, 인가를 구현할 경우, security filter에서 로그인을 완료하면 security session을 만들어서 Security Context Holder에 저장한다.
session은 Authentication 타입 객체이고, Authentication 안에는 User 정보를 포함하고 있다.
사용자 정보를 저장한다는 것은 세션-쿠키 기반의 인증 방식을 사용한다는 의미이다.
tomcat은 클라이언트 요청에 대한 세션을 메모리에 저장하고, 클라이언트한테 JSESSIONID라는 쿠키로 세션 아이디를 전달한다.
클라이언트는 api 요청시 JSESSIONID를 전달하고, 서버는 이를 확인하여 요청을 받아들인다.
스프링시큐리티가 알아서 JSESSIONID를 확인하고 요청을 처리한다.
인증이 완료된 사용자 브라우저에서 JSESSIONID 쿠키를 탈취하여, 쿠키를 통해 서버와 통신하는 행위로, 쿠키만 탈취하면 해당 서버에 로그인하여 여러가지 행위를 진행할 수 있다.
클라이언트가 사용자로부터 JSESSIONID를 받은 상태이고, 브라우저에 쿠키가 저장된 상태로 공격자의 악의적인 사이트에 접속했을 때, 쿠키를 이용하여 의도하지 않은 요청을 실행하게 된다.
ex) 쇼핑몰에 로그인하여 session 쿠키가 있는 상태로 악의적인 사이트에 접속하면 그 쇼핑몰에 있는 모든 상품을 구매하게 된다던지..
악의적인 사용자가 웹사이트에 악성 스크립트를 삽입하여 사용자의 쿠키를 탈취하거나 비정상적 행위를 하게끔 하는것으로, 사용자가 그 웹사이트에 접근할 때마다 스크립트가 작동하게 된다.
XSS를 이용하면 사용자의 쿠키를 탈취할 수 있고, CSRF를 이용하면 서버로부터 권한을 탈취한다. XSS는 클라이언트의 브라우저에서 발생하는 문제라면, CSRF는 서버에서 발생하는 문제이다.
CSRF 토큰을 만들어 세션에 저장하고, 클라이언트가 요청을 보낼 때 CSRF 토큰을 같이 보내도록 하여 값이 일치하는지 확인한다. CSRF 토큰 정보가 없다면 서버에서는 위조된 요청으로 판별한다. 보통 프론트에서 모든 백엔드 요청에 csrf 토큰을 담아 요청하도록 한다.
HTTP only를 통해 HTTP 통신 외에 Cookie 접근이 불가하도록 한다. 브라우저의 javascript 등으로 쿠키에 접근이 불가능한 것이다.
Set-Cookie: 쿠키명=쿠키값; path=/; HttpOnly
HttpOnly 옵션을 주면 활성화할 수 있다.
HTTPS 프로토콜을 이용하면 SSL 암호화가 적용되어 있기 때문에 데이터를 암호화해서 전달한다. 따라서 쿠키가 유출되도 암호화되어 정보를 알아낼 수 없다.
Set-Cookie: 쿠키명=쿠키값; path=/; secure
이렇게 secure 옵션을 주면, HTTPS가 아닌 통신에서는 쿠키를 전송하지 않도록 막을 수도 있다.
세션 불일치 문제: 서버가 여러개로 확장 되었을 때, 요청을 받은 서버의 세션 저장소에 유저 정보가 없다면 세션 불일치 문제가 발생할 수 있다.