0+ 스프링/0 + SpringBoot(스프링부트)

[스프링] HTTP Only와 Secure Cookie

힘들면힘을내는쿼카 2023. 1. 15. 02:19
728x90
반응형

HTTP Only와 Secure Cookie

Web HTTP Only와 Secure Cookie 이해하기
SpringBoot에서 HttpOnly 쿠키방식을 이용한 refreshToken 발급

 

SpringBoot에서 HttpOnly 쿠키방식을 이용한 refreshToken 발급

jwt의 access_token과 refresh_token를 구현하는 과정에서 프로젝트 프론트 팀원분이 refresh_token은 쿠키에 담아서 전송해달라는 요청이 들어왔다. 과정은 대략 아래와 같다. 전송방식은 Http Only 방식으로

dncjf64.tistory.com

 

[Web] HTTP Only와 Secure Cookie 이해하기

Cookie에 대한 이해 쿠키는 ASP.NET, PHP와 같은 특정 기술영역에 국한된 것도 아니고, 특정 Client나 Server에만 국한된 기술도 아닙니다. 쿠키는 수십 년 전부터 사용되어 왔으며 최근에는 HTTP에 있어서

nsinc.tistory.com

 

🍪 쿠키를 통해 우리는 http의 stateless의 단점을 보완하여 사용자에게 편의성을 제공합니다.
하지만, 쿠키를 통해 우리는 보안의 허점이 발생하게 됩니다.
이러한 허점을 이용해서 공격자들은 사용자의 정보를 빼내거나 해당 정보를 이용하여 악의적인 행위를 하게 됩니다.

랄로 유튜브

아 안심하세요 🍪 도둑입니다.

별거 아니에요.

 

HTTP Only

앞에서도 언급했듯이 HTTPstateless 하기 때문에 사용자의 상태를 기억하기 위해 쿠키에 많은 정보를 담아 통신을 합니다.
그래서 공격자들은 javascript를 사용하여 공격대상자의 쿠키를 탈취하려고 합니다.(대표적으로 XSS가 쿠키를 탈취하여 개인정보를 빼갑니다.)

이러한 방어책으로 HTTP Only가 등장합니다.
이방법은 브라우저에서(javascript를 통해) 쿠키에 접근할 수 없도록 제한하는 것 입니다.
이말은 HTTP Only로 저장된 정보는 javascriptDocument.cookieAPI로 접근이 불가하다는 의미이고
XSS를 방어할 수 있습니다.

TestController

@RestController
public class TestController {
    @GetMapping("/test/httpOnly")
    public String testHttpOnly(HttpServletResponse response) {

        Cookie cookie = new Cookie("Important_Info", "Hello_World");
        cookie.setMaxAge(7*24*60*60); // 7days
        cookie.setHttpOnly(true); // Http Only 활성화

        // 쿠키 전달
        response.addCookie(cookie);

        return "cookie";
    }
}

결과(Http Only 적용)

javascript를 통해 조회 불가

결과(Http Only 적용X)

정리하면 다음과 같습니다.

  • javascriptDocument.cookieAPI로 접근이 불가
  • 브라우저에서 HTTP Only가 설정된 쿠키 조회 불가
  • 서버로 HTTP Request에만 쿠키 전송
  • XSS(Cross Site Scripting) 공격 차단
반응형

Secure Cookie

HTTP Only를 사용하면 브라우저(javascript)를 통해서 쿠키를 조회하는 것을 막을수 있습니다.
하지만, 와이어 샤크 같은 네트워크 모니터링 프로그램을 통해 패킷을 직접 탈취하여 쿠키를 탈취 할수 있습니다.
이러한 정보 유출을 막기위해서 HTTPS를 사용하여 데이터를 암호화 하는 방법이 주로 사용됩니다.
(쿠키 또한 암호화 되어 전송하기 때문에, 제 3자는 해당 내용을 파악하기 어렵습니다.)

문제는 HTTPS로 전송되어야할 데이터가 HTTP를 통해 유출되는 경우가 있습니다.🥲

<img src="http://www.helloworld.com/images/securityImage.png" />

브라우저는 http://로 시작되는 코드를 만나게 되면 암호화되지 않은 상태로 쿠키를 서버로 전달해버립니다.
이때 공격자가 쿠키를 탈취하게 되면…..? 🙀

이러한 사고를 발생하기 위해 쿠키를 생성할때 secure 접미사를 사용할 수 있습니다.
해당 방식을 secure cookie라고 부릅니다.

이렇게 설정한 브라우저는 HTTPS 아닌 통신에서는 쿠키를 전송하지 않습니다.
더 직관적으로 설명하면 HTTPS를 사용하지 않은 서버에게는 쿠키를 전송하지 않습니다.

TestController

@RestController
public class TestController {

    @GetMapping("/test/httpOnly")
    public String testHttpOnly(HttpServletResponse response) {

        Cookie cookie = new Cookie("Important_Info", "Hello_World");
        cookie.setMaxAge(7*24*60*60); // 7days
        cookie.setSecure(true); // secure cookie 활성화
        cookie.setHttpOnly(true); // Http Only 활성화

        // 쿠키 전달
        response.addCookie(cookie);

        return "cookie";
    }
}

결과(Secure Cookie 적용)

http로 요청시 Request Headerscookie가 없는것을 확인 할 수 있습니다.

결과(Secure Cookie 적용X)

http로 요청시 Request Headerscookie가 있는 것을 확인 할 수 있습니다.

 

 

 

728x90
반응형