728x90

XSS : Cross Site Scripting

사이트를 교차해서 스크립트를 발생시킴.
게시판을 포함한 웹에서 자바스크립트같은 스크립트 언어를 삽입해 개발자가 의도하지 않은 기능을 작동시키는 것
클라이언트 측을 대상으로 한 공격이다.

게시판에서 글을 쓰는곳에 작성자가 HTML 코드를 삽입하여 글을 읽는사람의 브라우저에서 실행되게 하는 원리이다.

이게 단순하게 alert()만 띄운다고 되는것이 아니라 그 스크립트 안에 엄청 긴 코드를 주입해서 무한정 창을 띄우게 하거나 악성코드를 직접적으로 받게 할수는 없지만, URL을 클릭하도록 유도하여 악성 프로그램을 다운받는 사이트로 Redirect시킨다.

위험성

  1. 쿠키 정보 및 세션 획득
    공격자는 XSS에 취약한 페이지 및 게시판에 XSS공격을 수행함으로써 해당 페이지를 이용하는 사용자의 쿠키 정보나 세션 ID를 획득할 수 있다.
    이렇게 되면 XSS공격을 통해 페이지를 사용하는 사용자의 세션ID를 얻어서 공격자가 불법적으로 사용자인 척 하면서 활보할 수 있다.
  2. 시스템 관리자 권한 획득
    XSS취약점이 있는 웹서버에 다양한 악성 데이터를 포함시킨 후, 사용자의 브라우저가 악성 데이터를 실행하게 할 수 있다.
    만약 이렇게 해킹이 될 경우, 내부로 악성코드가 이동해 중요 정보가 탈취될 수 있다.
  3. 거짓페이지 노출
    <script> 뿐만이 아니라 <img>와 같은 그림을 표시하는 태그를 사용해 원래 페이지와 전혀 관련 없는 페이지를 표시할 수가 있다.

XSS 방지법

XSS 공격은 IPS, IDS, 방화벽 등으로도 방지할 수가 없다.
그래서 문자를 필터링 해주는 방법이 있다.

Script 문자 필터링

XSS 공격은 입력값에 대한 검증이 제대로 이루어지지 않아 발생하는 취약점이다. 그래서 입력값에 대해 서버는 필터링을 해야 한다. < > " ' 와 같은 문자열들을 정규표현식으로 필터링하여 태그를 제거해준다.

예시

게시판에서 글 제목을 클릭하면 다른 페이지로 넘어가서 글 상세보기를 해준다고 가정을 했을 때, 제목을 <a href="hi">test</a> 로 한다면 원래 보여주려던 '상세보기'는 구현할 수 없고 href에 있는 hi 주소로 http 통신을 보내기 때문에 생뚱맞는 페이지를 호출하여 redirect 해준다.

이 점을 항상 생각하고 유의하여 코드를 작성하여야 한다.

728x90
728x90

JPA 오류 💢

jpa에서 spring.jpa.hibernate.ddl-auto=create 속성으로 테이블을 만들어줄 경우에
MariaDB default로 어떤값을 주던간에 latin1속성으로 insert가 된다. 그래서 이방법 말고 안에서 테스트만 한다고 하면 h2 DB를 사용하는 것이 더 바람직하다.

아니라면 ddl-auto 속성을 주지않고 직접 MariaDB에서 어떤 Column들을 넣을지 결정하고 먼저 생성한 다음 연결하는게 좋을 것이다.
이것 때문에 애를 많이 먹었다.

[mysqld]
datadir=C:/Program Files/MariaDB 10.5/data
port=3306
innodb_buffer_pool_size=1948M
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
[client]
port=3306
plugin-dir=C:/Program Files/MariaDB 10.5/lib/plugin
default-character-set=utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8

MariaDB data 경로에 있는 my.ini 파일인데 이렇게 바꿔주면 기본으로 utf8 설정을 할 수 있다.

데이터베이스 character set 확인
show create database 데이타베이스명;

데이터베이스의 character set 변경
alter database 데이타베이스명 default character set = utf8;

테이블 character set 확인
show create table 테이블명;

테이블의 character set 변경
alter table 테이블명 default character set = utf8;

각 컬럼별 character set 확인
show full columns from 테이블명;

각 컬럼별 character set 변경
alter table 테이블명 modify column 컬럼명 varchar(20) character set utf8 collate utf8_general_ci;

ddl-auto로 생성하였다면 이렇게 일일이 바꿔주어야 한다. 꼭 명심하고 체크한 뒤에 test를 진행하자.😨

728x90

'JPA' 카테고리의 다른 글

[JPA] 영속성 관리  (0) 2022.08.04
[JPA] JPA 스터디 2장  (0) 2022.08.04
[JPA] JPA 스터디 1장  (0) 2022.08.04
[JPA] JPA Auditing  (0) 2022.08.03
728x90

Mock 빈 오류에 관해서

그동안 혼자 공부한 것들을 토대로 프로젝트를 하나 해보려고 한다.
나름 공부한다고 공부를 했는데 HelloWorld 구현하는데 컨트롤러를 만들어두고 테스트 코드를 내의지대로 처음 작성해봤다.
MockMvc 클래스를 사용하여 Mock Bean을 주입받으려고 했더니 빈이 등록되지 않았다는 오류를 받았다.
일단 오류에는 두가지가 있었다.
@SpringBootTest 어노테이션을 사용할때 @WebMvcTest도 같이 사용해서 MockBean을 주입받는줄 알고 바로 넣었는데 두 Mock객체가 공유되어있는 객체가 아니고 서로 다른 객체이다. 그래서 두개의 빈이 충돌이 발생한다.

여기서 해결책은 두가지였다.

  • @SpringBootTest@AutoConfigurationMockMvc를 사용한 후 MockMvc의 @Autowired를 제거 하는 방법
  • @ExtendWith, @WebMvcTest@Autowired를 같이 사용하는 방법

이렇게 두가지가 있었다.

먼저 @SpringBootTest의 경우 일반적인 테스트로 슬라이싱을 사용하지 않기 때문에 전체 응용 프로그램 Context를 시작한다. 때문에 전체 응용 프로그램을 불러서 모든 bean을 주입하기 때문에 속도가 느리다고 한다.

@WebMvcTest의 경우는 뒤에 ()를 사용해 특정 레이어를 테스트하고 모의 객체를 사용하기 때문에 필요한 bean을 직접 세팅해줘야 하는 단점이 있지만, 가볍고 빠르게 테스트 할 수 있다.

위의 두가지중 아래의 방법에서는 같이 @AutoConfigurationMockMvc를 사용이 가능하다.

가짜 객체인 Mock을 사용할 때 bean 주입하는데에 있어서 이것을 생각하고 주입해주도록 하자.

728x90

'Spring' 카테고리의 다른 글

Spring Data JPA  (0) 2022.08.06
Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] Spring Security  (0) 2022.08.03
의존성 주입 어노테이션 정리  (0) 2022.08.03
728x90

그리디 알고리즘

그리디 알고리즘은 단순하지만 강력한 문제 해결 방법이다.
단어 그대로 번역하자면 탐욕법이다.
이 부분에서 탐욕적이라 함은 '현재 상황에서 지금 당장 좋은 것만 고르는 방법'이다.
이 알고리즘은 매 순간 가장 좋아 보이는 것만 선택하고, 그 선택이 나중에 어떤 영향을 미치는지에 대해서는 고려하지 않는다.

거스름돈을 예시로 살펴보자
당신은 음식점의 계산을 도와주는 점원이 되었다고 가정하자.
500원, 100원, 50원, 10원짜리 동전은 무한히 존재한다. 손님에게 거슬러줘야 하는 돈이 N원일 때, 거슬러 줘야 할 동전의 최소 개수를 구해라
(단, 거슬러줘야 할 돈 N은 항상 10의 배수이다.)

이럴때는 단순하게 가장 가격이 큰 동전 부터 돈을 거슬러 주는 것이다.
이렇게 되면 N원으로 설정된 가격을 금방 차감시켜 0원으로 만들기 적합하다.

coin.py

n = 1260 # 거슬러줘야할 가격
count = 0 # 코인의 개수

# 화폐 단위가 큰 것부터 차례로 거슬러준다.
coin_types = [500, 100, 50, 10]

for coin in coin_types:
    count += n // coin # 원래 가격을 코인값으로 나눈 몫만큼 동전으로 추가해줌
    n %= coin

print(count)

화폐의 종류가 K개 라고 할때, 위 소스의 시간복잡도는 BigO 표기법으로 O(K)이다. 시간복잡도에서는 총 화폐인 N을 찾을 수 없다.
그래서 이 알고리즘은 동전의 종류에만 영향을 받지 거슬러 줘야하는 금액에는 초점이 맞춰지지 않는다.

알고리즘 문제 유형을 바로 파악하기 어렵다면, 그리디 알고리즘을 의심해 볼 수 있다.

그리디 알고리즘의 예제를 많이 풀어봐야겠다.

728x90

'CS' 카테고리의 다른 글

불 논리 회고  (0) 2022.08.07
HTTP  (0) 2022.08.07
불 논리 정리  (0) 2022.08.07
재귀 알고리즘  (0) 2022.08.06
728x90

Enum

소스코드를 분석을 하다 보니 너무 많은 if-else 가 엮여져 있는 코드들을 많이 봐서 너무 어지러웠다. 이것을 어떻게 할 수 없을까에 대한 고찰을 가지고 있다가 처음엔 switch조건을 생각해서 메소드로 따로 빼내자고만 생각했다.
근데 Enum을 찾아본 결과 너무 좋아서 포스팅하게 되었다.

Enum이란

  • Enum은 Eumeration로 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미한다.

  • 자바에서 final static String, int와 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 Enum으로 대체해서 사용할 수 있다.

  • 인터페이스나 클래스로 상수를 정의하는 것을 보완하여 IDE의 지원을 적극적으로 받고 타입 안정성도 갖출 수 있게 된다.

예를 들면 이런 코드였다.

    String ss = "A구역";

    if(ss.equals("A구역")) {
        System.out.println(ss);
    }else if(ss.equals("B구역")) {
        System.out.println(ss);
    }else if(ss.equals("C구역")) {
        System.out.println(ss);
    }else if(ss.equals("D구역")) {
        System.out.println(ss);
    }

이렇게되면 계속 else if(ss.equals("구역")이 지금은 적어도 가독성이 이렇게 좋지 않은데 엄청 많은 구역이 있다고 한다면 그만큼의 줄 수를 채워서 단지 if 조건 하나만을 수행한다. 참으로 효율이 떨어지는 코드이다.

여기서 Enum을 사용했다.

TestEnum.java

enum TestEnum{
    A("a", "A구역");
    B("b", "B구역");
    C("c", "C구역");
    D("d", "D구역");

    private String alpa;
    private String name;

    TestEnum(String alpa, String name){
        this.alpa = alpa;
        this.name = name;
    }

    public String getName(){
        return name;
    }
}

이렇게 A,B,C,D라는 키에 각각 Value 값을 넣어준다. 값을 할당하는 갯수는 자유이다. 대신 생성자의 매개변수도 같이 늘어나야 한다.

그러면서 메인함수 실행 클래스에서 어떻게 설정하는지 이제 보도록 하자.

Main.java

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String key = sc.next();

        String str = TestEnum.valueOf(key).getName();
        String alpa = TestEnum.valueOf(key).getAlpa();    
    }
}

이렇게 설정을 해준 상태에서 위의 코드에서는 입력을 받아 key 변수에 값을 넣어준다. A,B,C,D 의 키값을 호출하게 되면 안에 있는 A구역이라면 alpa에는 a가, name에는 A구역이 들어가게 된다.
이렇게 해서 기존의 코드에서 상당히 많은 줄 수를 줄이면서 가독성도 높여 실용적으로 고칠 수 있는 방법을 터득하게 되었다.

앞으로 if-else구문이 나올때 반복되는게 많아진다면 Enum을 사용하는 것을 염두에 두고 코드를 짜 나갈 것이다.

그리고 Enum에 대해 추가적으로 더 공부가 필요해 보인다.

이상으로 Enum포스팅을 마친다.

728x90

'Java' 카테고리의 다른 글

MockMvc  (0) 2022.08.04
Mock, Mockito  (0) 2022.08.04
[Java] Optional  (0) 2022.08.03
Java Stream API  (0) 2022.08.03
728x90

스프링 시큐리티

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증, 권한, 인가 등) 을 담당하는 스프링 하위 프레임워크이다.
인증인과를 담당하는 프레임워크이다.

🔒스프링 시큐리티 특징과 구조

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있다

  • Filter 기반으로 동작하여 MVC와 분리하여 관리 동작

  • 어노테이션을 통한 간단설정

  • 세션과 쿠키 방식으로 인증

  • 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리

어떤 유저가 로그인을 했을 시에 기본 회원과 admin 유저가 있다고 가정을 하면 회원인지 admin인지 인증 관리자가 먼저 판단을 한다. 그래서 누구인지 명확하게 알고 이 로그인한 유저에 대한 권한을 접근 결정 관리자가 판단을 하는데 여기서 특정 기능에 대한 권한이 없다면 그 동작은 실행시켜주지 않게끔 동작을 수행한다.

  • 인증 관리자는 UsenamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행한다.

🔒스프링 시큐리티 기본 구조
스프링 시큐리티 기본 구조

📢각 필터별 기능 설명

필터 기능
SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당함
LogoutFilter 로그아웃 URL로 지정된 가상URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃 시킴
UsernamePasswordAuthenticationFilter 사용자 명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함
DefaultLoginPageGeneratingFilter 폼기반 또는 OpenId 기반 인증에 사용하는 가상URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성한다
BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하고 이를 처리함
RequestCacheAwareFilter 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용됨 --> 현재 요청과 관련있는 캐시 요청이 있는지 확인하고 있다면 캐시요청을 처리해줌
AnonymousAuthenticationFilter 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨
SessionManagementFilter 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움
ExceptionTranslationFilter 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리
FilterSecurityInterceptor 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌
728x90

'Spring' 카테고리의 다른 글

Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] MockMvc Bean 주입 에러  (0) 2022.08.04
의존성 주입 어노테이션 정리  (0) 2022.08.03
Spring Test MockMvc 한글 깨짐 처리  (0) 2022.08.03

+ Recent posts