안녕하세요. 1달 정도만에 새로운 포스팅으로 찾아 뵙습니다. 오늘은 웹 어플리케이션의 일반적인 보안 취약성에 대해서 알아보는 시간을 가져보고자 합니다. 이렇게 보안 취약성을 알아 본 후 Spring Security의 사용으로 이를 방어하는 방법까지 알아보도록 하겠습니다.
개요
웹 어플리케이션을 개발함에 있어서 목표로 하는 비즈니스를 문제를 해결하는 기능을 개발하는 것은 중요합니다. 하지만 이러한 기능적인 부분 뿐만 아니라 비기능적인 개발또한 중요합니다. 비기능적인 부분이라는 것은 실제 기능에는 영향이 없지만 부수적으로 고려해야할 사항을 말합니다. 대표적으로 성능, 확장성, 가용성, 그리고 보안이 있는데요.
이 중 오늘 이야기하고자하는 보안에 대해서 이야기해보자면 이를 중요하게 생각하지 않으면 어플리케이션의 수익성에도 상당한 영향을 받을 수 있으며, 공격에 의해서 유저의 정보 유출 등으로 인한 신뢰도 하락, DDoS 공격등에 대해서 쉽게 서비스의 오류가 발생할수도 있습니다.
소프트웨어 보안과 알고 있어야 할 일반적인 취약성의 목록
서비스를 개발하면서 보안까지 생각하려니 갑자기 머리가 아픕니다. 우리가 지켜야할 모든 보안에 대해서 알기는 현실적으로 무리가 있습니다. 하지만 일반적으로 발생할 수 있는 부분에 대해서는 보안을 잘 생각하며 서비스를 만들 필요가 있습니다. 서비스를 개발하면서 생각해야할 기본적인 취약성 리스트는 아래와 같습니다.
- 인증 취약성
- 세션 고정
- XSS (교차 사이트 스크립팅)
- CSRF (사이트 간 요청 위조)
- 주입 (Injection)
- 기밀 데이터 노출
- 메서드 접근 제어 부족
- 알려진 취약성이 있는 종속성 이용
오늘 포스팅에서 위에서 언급한 요소들에 대해서 하나씩 알아보도록 하겠습니다.
인증 취약성 (Authentication vulnerability)
인증 취약성에 대해서 이야기하기 위해서는 인증(Authentication)과 인가(Authorization)에 대해서 명확하게 알아야합니다. 먼저 인증이란 서비스가 서비스를 이용하는 유저가 누구인지를 확실하게 식별하는 프로세스를 말합니다. 그래서 인증이 완료되었다는 것은 서비스가 이 유저가 누구인지 인지했다라는 것입니다. 그리고 인가는 인증된 호출자가 특정 기능과 데이터 대한 이용 권리가 있는지 판단하는 프로세스입니다.
인증 취약성이란 사용자가 악의를 가지고 다른 사람의 기능이나 데이터에 접근할 수 있을 수 있다는 것입니다. 아래의 호출 예제를 보도록 하겠습니다.
GET /users/{userId}
위 API는 본인의 userId(숫자)를 넣어서 본인의 정보를 취득하라고 만들어 둔 API라고 하도록 하겠습니다. 하지만 위 API는 userId에 임의의 숫자를 넣어 본인이 아닌 다른 사람의 정보를 취득할 수 있는 취약점을 가지고 있습니다. 이에 대한 아무런 대책을 서버에서 가지고 있지 않았다면 그대로 정보가 유출되는 사고가 발생할 것입니다. 바로 이런 케이스가 인증 취약성을 활용한 공격입니다. 우리는 코딩 할 때 이에대한 방어가 필요합니다.
세션 고정 (Session Fixation)
세션 고정이란 웹 서비스 인증 프로세스 중에서 기존 세션 ID가 재사용 될 가능성이 있을 때 발생할 수 있는 취약점으로 해당 취약점이 발생하면 공격자는 피해자의 모든 행위를 할 수 있습니다. 공격 flow는 아래와 같습니다.
이러한 공격은 JSESSION을 이용할 때, 고정된 JSESSION을 사용할 때 발생 할 수 있습니다. 로그인 시 고유한 JSESSION을 발급하여 취약점을 막을 수 있습니다.
XSS (교차 사이트 스크립팅)
XSS(Cross Site Scripting)는 서버에 노출된 서비스로 클라이언트 쪽 스크립트를 주입해서 다른 사용자가 이를 실행하도록 하는 공격입니다. 예를 들어 게시판에 공격자가 악성 스크립트가 들어간 게시글을 올리게 되면 그 게시물을 보는 것 만으로도 피해자가 되게 되는 공격입니다.
CSRF (사이트 간 요청 위조)
CSRF(Cross-Site Request Forgery)는 사용자가 서비스에 원하지 않는 동작을 실행 하도록 강제하는 공격을 말합니다. 일반적으로 이런 공격을 이용하여 공격자는 데이터 변경등의 동작을 합니다.
이러한 공격은 아래의 flow를 통해서 가능하게 됩니다. 이러한 공격 주요 방법은 Session을 탈취하여 대신 API를 호출하는 방식을 취하는 것입니다.
마무리
오늘은 이렇게 서비스에서 발생할 수 있는 일반적인 보안 취약성의 4가지, 인증 취약성, 세션 고정, XSS, CSRF에 대해서 알아보았습니다. 이 모두 공격을 당했을 때 무시무시한 결과를 초래할 수 있다는 사실을 알게 되셨을 것 같습니다
다음 포스팅으로 아직 다 이야기하지 못한 나머지에 대해서 이야기하는 시간을 가져보고 Spring Security에서 이를 막는 방법에 대해서 실습하는 시간으로 들어가보도록 하겠습니다.
감사합니다.
참조
[1] 스프링 시큐리티 인 액션
[3] https://4rgos.tistory.com/1
'기타 > 보안' 카테고리의 다른 글
[OAuth2] OAuth2 개론 - 개요와 Authorization Code Flow (0) | 2023.03.11 |
---|---|
[JWT+JAVA] JWT(Json Web Token)에 대해서 자세히 알아봅시다 - 실습편 (0) | 2023.02.27 |
[JWT] JWT(Json Web Token)에 대해서 자세히 알아봅시다 - 이론편 (0) | 2023.02.19 |
[기타] 서비스의 일반적인 보안 취약성 - 2편 (0) | 2022.11.12 |
자바(java) 보안(SECURE) 코딩 1. SQL, 자원(Resource) 삽입(Injection) (0) | 2019.06.19 |
댓글