[Spring Security] Session, Cookie

수깡·2024년 3월 5일

Spring Security

목록 보기
7/11

세션이란?

클라이언트와 서버의 연결정보를 세션이라고 한다.
서버는 세션을 메모리에 저장하여 관리한다.

쿠키란?

Http의 일종으로, 사용자가 웹사이트를 방문할 경우 해당 사이트가 사용하는 서버에서 사용자의 컴퓨터에 저장하는 기록 정보 파일(text)이다.

  • key- value 쌍으로 구성되어 있고, 쿠키이름, 쿠키값, 만료시간, 전송할 도메인명, 전송할 경로, 보안연결여부, HttpOnly여부 의 정보를 포함한다.

스프링 시큐리티로 인증, 인가를 구현할 경우, security filter에서 로그인을 완료하면 security session을 만들어서 Security Context Holder에 저장한다.

session은 Authentication 타입 객체이고, Authentication 안에는 User 정보를 포함하고 있다.
사용자 정보를 저장한다는 것은 세션-쿠키 기반의 인증 방식을 사용한다는 의미이다.

tomcat은 클라이언트 요청에 대한 세션을 메모리에 저장하고, 클라이언트한테 JSESSIONID라는 쿠키로 세션 아이디를 전달한다.

클라이언트는 api 요청시 JSESSIONID를 전달하고, 서버는 이를 확인하여 요청을 받아들인다.

스프링시큐리티가 알아서 JSESSIONID를 확인하고 요청을 처리한다.

🌟 발생할 수 있는 문제

세션 하이재킹(Session hijacking)

인증이 완료된 사용자 브라우저에서 JSESSIONID 쿠키를 탈취하여, 쿠키를 통해 서버와 통신하는 행위로, 쿠키만 탈취하면 해당 서버에 로그인하여 여러가지 행위를 진행할 수 있다.


CSRF 공격

  • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(CUD) 를 서버에 요청하게 하는 공격
    세션 쿠키로 로그인을 구현할 경우, CSRF(Cross-site request forgery) 공격을 조심해야한다.
    쿠키는 stateless한 서버를 stateful하게 사용하려고 만든 것, 쿠키를 클라이언트에서 관리하기 때문에 보안이 취약하고 남이 가로채기 쉽다.

CSRF 공격의 이유

클라이언트가 사용자로부터 JSESSIONID를 받은 상태이고, 브라우저에 쿠키가 저장된 상태로 공격자의 악의적인 사이트에 접속했을 때, 쿠키를 이용하여 의도하지 않은 요청을 실행하게 된다.
ex) 쇼핑몰에 로그인하여 session 쿠키가 있는 상태로 악의적인 사이트에 접속하면 그 쇼핑몰에 있는 모든 상품을 구매하게 된다던지..


XSS(Cross-Site Scriptiong)

악의적인 사용자가 웹사이트에 악성 스크립트를 삽입하여 사용자의 쿠키를 탈취하거나 비정상적 행위를 하게끔 하는것으로, 사용자가 그 웹사이트에 접근할 때마다 스크립트가 작동하게 된다.

XSS를 이용하면 사용자의 쿠키를 탈취할 수 있고, CSRF를 이용하면 서버로부터 권한을 탈취한다. XSS는 클라이언트의 브라우저에서 발생하는 문제라면, CSRF는 서버에서 발생하는 문제이다.


🌟 방어

CRSF 토큰

CSRF 토큰을 만들어 세션에 저장하고, 클라이언트가 요청을 보낼 때 CSRF 토큰을 같이 보내도록 하여 값이 일치하는지 확인한다. CSRF 토큰 정보가 없다면 서버에서는 위조된 요청으로 판별한다. 보통 프론트에서 모든 백엔드 요청에 csrf 토큰을 담아 요청하도록 한다.

HTTP Only Cookies(XSS 문제 해결)

HTTP only를 통해 HTTP 통신 외에 Cookie 접근이 불가하도록 한다. 브라우저의 javascript 등으로 쿠키에 접근이 불가능한 것이다.

Set-Cookie: 쿠키명=쿠키값; path=/; HttpOnly

HttpOnly 옵션을 주면 활성화할 수 있다.

Secure Cookies

HTTPS 프로토콜을 이용하면 SSL 암호화가 적용되어 있기 때문에 데이터를 암호화해서 전달한다. 따라서 쿠키가 유출되도 암호화되어 정보를 알아낼 수 없다.

Set-Cookie: 쿠키명=쿠키값; path=/; secure

이렇게 secure 옵션을 주면, HTTPS가 아닌 통신에서는 쿠키를 전송하지 않도록 막을 수도 있다.


🌟 Session 정리

  • 인증된 사용자 정보를 서버가 관리한다.
  • 세션 ID는 고유한 값이고, 클라이언트 쿠키에 JSESSION으로 저장되어 요청시 함께 전송되어 인증된 사용자임을 증명한다.
  • 클라이언트 측에서 JSESSION만 사용하므로 상대적으로 적은 네트워크 트래픽을 사용한다.
  • 세션 데이터가 많아질수록 서버 부담이 가중된다.
  • 세션 불일치 문제가 발생할 가능성이 생긴다.

    세션 불일치 문제: 서버가 여러개로 확장 되었을 때, 요청을 받은 서버의 세션 저장소에 유저 정보가 없다면 세션 불일치 문제가 발생할 수 있다.

0개의 댓글