Access-Control-Allow-Origin 코드와 보안
Q1.
(08-09의 SimpleRestfulController 에서)
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
response.setHeader("Access-Control-Allow-Origin", "*");
이건 java 컨트롤러에서의 코드인데, 해당 코드가 보안에 위험한 이유가 뭐야? 저 4줄 모두가 위험한거야, 아니면 그 중 일부가 위험한거야?
A1.
해당 코드에서 보안 위험이 있는 부분은 Access-Control-Allow-Origin 헤더를 "*"로 설정한 부분입니다. 아래에서 각각의 헤더가 어떤 역할을 하는지, 그리고 왜 특정 설정이 보안 위험을 초래할 수 있는지 설명하겠습니다.
1. Access-Control-Allow-Methods
java
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
이 헤더는 허용된 HTTP 메서드(POST, GET, PUT, DELETE)를 지정하는 역할을 합니다. 이 설정 자체는 특정 메서드만을 허용하므로 큰 보안 위험은 없습니다. 다만, 허용할 메서드를 필요 이상으로 넓게 설정할 경우, 잘못된 요청을 허용할 수 있으므로 가능한 최소한으로 좁히는 것이 좋습니다.
2. Access-Control-Max-Age
java
response.setHeader("Access-Control-Max-Age", "3600");
이 헤더는 CORS(Cross-Origin Resource Sharing) 요청을 얼마나 오래 캐싱할지 설정하는 값입니다. 보안에는 큰 영향을 주지 않으며, 성능 최적화를 위한 설정입니다.
3. Access-Control-Allow-Headers
java
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
이 헤더는 클라이언트가 보낼 수 있는 커스텀 헤더를 정의합니다. 여기서는 x-requested-with 헤더를 허용하고 있는데, 보안적으로 크게 문제를 일으키지 않습니다. 다만, 허용되는 헤더를 필요 이상으로 많이 추가하면 보안 취약점이 될 수 있습니다.
4. Access-Control-Allow-Origin
java
response.setHeader("Access-Control-Allow-Origin", "*");
이 부분이 보안적으로 가장 위험한 설정입니다. "*"로 설정하면 모든 도메인에서 해당 서버에 요청을 보낼 수 있도록 허용하겠다는 의미입니다. 이로 인해 다음과 같은 보안 문제가 발생할 수 있습니다.
1. 데이터 탈취 위험: 모든 도메인에서 접근이 가능하므로, 악의적인 사이트에서 사용자 인증 정보를 포함한 요청을 서버로 보낼 수 있고, 응답 데이터를 가로챌 수 있습니다.
2. CSRF(Cross-Site Request Forgery) 공격 가능성 증가: 특정 조건에서 CORS 설정이 잘못되면 CSRF 공격이 더 쉬워질 수 있습니다. 공격자가 사용자 브라우저에서 인증된 세션으로 서버에 요청을 보내고 악의적인 작업을 수행할 수 있습니다.
해결 방법
보안을 강화하려면 Access-Control-Allow-Origin 헤더를 특정 도메인으로 제한하는 것이 좋습니다. 예를 들어, 허용된 도메인만 지정할 수 있습니다.
java
response.setHeader("Access-Control-Allow-Origin", "https://trusted-domain.com");
요약하자면, 보안에 가장 큰 위험 요소는 "*"로 설정된 Access-Control-Allow-Origin입니다.