HTTP Only와 Secure Cookie
Web HTTP Only와 Secure Cookie 이해하기
SpringBoot에서 HttpOnly 쿠키방식을 이용한 refreshToken 발급
🍪 쿠키를 통해 우리는 http의 stateless의 단점을 보완하여 사용자에게 편의성을 제공합니다.
하지만, 쿠키를 통해 우리는 보안의 허점이 발생하게 됩니다.
이러한 허점을 이용해서 공격자들은 사용자의 정보를 빼내거나 해당 정보를 이용하여 악의적인 행위를 하게 됩니다.
아 안심하세요 🍪 도둑입니다.
별거 아니에요.
HTTP Only
앞에서도 언급했듯이 HTTP
는 stateless
하기 때문에 사용자의 상태를 기억하기 위해 쿠키에 많은 정보를 담아 통신을 합니다.
그래서 공격자들은 javascript
를 사용하여 공격대상자의 쿠키를 탈취하려고 합니다.(대표적으로 XSS
가 쿠키를 탈취하여 개인정보를 빼갑니다.)
이러한 방어책으로 HTTP Only
가 등장합니다.
이방법은 브라우저에서(javascript
를 통해) 쿠키에 접근할 수 없도록 제한하는 것 입니다.
이말은 HTTP Only
로 저장된 정보는 javascript
의 Document.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)
정리하면 다음과 같습니다.
javascript
의Document.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 Headers
에 cookie
가 없는것을 확인 할 수 있습니다.
결과(Secure Cookie 적용X)
http
로 요청시 Request Headers
에 cookie
가 있는 것을 확인 할 수 있습니다.
'0+ 스프링 > 0 + SpringBoot(스프링부트)' 카테고리의 다른 글
[스프링] 동시성 문제 해결(ThreadLocal) (0) | 2023.01.17 |
---|---|
[JPA 에러 해결] Named parameter not bound: ~ (0) | 2022.07.29 |
[JPA 에러 해결] Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a ~ " 오류 해결 (0) | 2022.07.27 |
JPA 복합키 사용방법(@IdClass, @EmbeddedId) (0) | 2022.06.02 |
Websocket Server headers 추가 방법(javax.websocket, spring boot) (0) | 2022.05.18 |