본문 바로가기

분류 전체보기

(287)
Node.js | Crypto 모듈을 사용해 비밀번호 암호화 하기 node에서 기본으로 제공해주는 Crypto 모듈을 사용해 비밀번호를 암호화하기로 했다. 비밀번호는 복호화 할 수 없게 단방향 암호화를 해야 한다. 단방향 암호화 중 가장 쉬운 방법은 hash를 하는 것인데, Crypto에서 일반 hash를 생성하는 함수도 제공한다. 하지만 더 안전하게 암호화하기 위해서는 salt를 사용해야 한다. salt란 해시할 때 추가로 사용되는 데이터다. salt를 사용하지 않고 해시만 할 경우에는 동일한 해시가 생성될 가능성이 있기 때문에 salt라는 추가적인 값을 더해 암호화를 한다. 이 때 salt는 비밀번호를 암호화할 때 마다 랜덤하게 생성된 값이어야 한다. 즉, 사용자의 비밀번호를 암호화할 때 마다 새로운 salt를 무작위로 생성해서 사용한다. 항상 동일한 salt를 사..
트랜잭션 트랜잭션이란 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법이다. 개념적으로 한 트랜잭션 내의 모든 읽기와 쓰기는 한 연산으로 실행된다. 트랜잭션의 핵심은 일련의 작업 도중 오류가 생기면 취소(abort, rollback)되고, 안전하제 재시도 할 수 있다는 것이다. 트랜잭션은 전체가 성공(commit)하거나 실패(abort, rollback)하므로 트랜잭션이 실패하면 애플리케이션에서 안전하게 재시도 할 수 있다. 즉, 트랜잭션 덕분에 부분적인 실패를 걱정할 필요가 없으므로 애플리케이션에서 오류를 처리하기 훨씬 쉬워진다. ACID 트랜잭션은 ACID 속성을 가진다. Atomicity - 원자성 여러 작업이 하나의 원자적인 트랜잭션으로 묶여있다. 트랜잭션 도중 어떠한 결함으로 인해 ..
Docker | MariaDB utf8 설정 그냥 docker run으로 하는 방법 -d옵션은 백그라운드로 실행하는 옵션이다. $ docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=[root계정 비밀번호] \ -e MYSQL_DATABASE=[데이터베이스명] \ -e MYSQL_USER=[새롭게 생성할 user명] \ -e MYSQL_PASSWORD=[새롭게 생성할 user의 비밀번호] \ -v [볼륨]:/var/lib/mysql \ --network [네트워크명 생략 가능] \ --name [컨테이너명] \ mariadb Dockerfile이나 docker-compose를 사용해 이미지를 만드는 방법을 추천한다. MariaDB(MySQL)의 기본 character-set이 latin1로 돼 있기 때문에 ..
React | react-chartjs-2 ticks 설정 react-chartjs-2를 사용하는데, options 설정이 제대로 안 돼서 서칭한 결과를 기록 겸 공유 한다. 설정하는 방법은 Linear Scale - Step Size을 참고한다. ticks: {stepSize: 10}을 설정해 단위가 10으로 고정되도록 설정한다. import { Bar } from 'react-chartjs-2'; import { Chart as ChartJS, registerables } from 'chart.js'; ChartJS.register(...registerables); const options = { scales: { y: { min: 0, max: 100, ticks: { stepSize: 10, }, }, }, }; 위 설정만으로 안 될 경우 maintain..
Mockito | @Mock, @InjectMocks MockitoExtension JUnit5는 @ExtendWith애노테이션을 사용한다. 해당 애노테이션을 사용하면 @Mock, @Spy, @InjectMocks와 같은 MockitoAnnotations를 사용할 수 있게된다. @ExtendWith(MockitoExtension.class) class SomeTestClass {}@ExtendWidth()로 설정하고 싶지 않다면 직접 해줄 수도 있다.. public class SampleBaseTestCase { private AutoCloseable closeable; @Before public void openMocks() { closeable = MockitoAnnotations.openMocks(this); } @After public void re..
M1 puppeteer 오류 brew로 일단 설치.. $ brew install chromium ## 재설치 $brew reinstall --cask chromium 설치 확인 $ which chromium ~./zshrc에 경로값을 잘 가져오도록 환경변수 등록 # chromium export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true export PUPPETEER_EXECUTABLE_PATH=`which chromium` 그래도 오류가 났다 /usr/bin/chromium-browser경로에 크롬이 없다고.. Error: Failed to launch the browser process! spawn /usr/bin/chromium-browser ENOENT node_modules/puppeteer/lib/..
Nginx | 로그 경로 바꾸기 + permission denied 로그 경로를 바꾸는 설정은 간단하다. conf파일에서 설정해주면 되고, 각 서버 블록 안에 넣으면 서버별로 따로 로그가 생성된다. server { access_log /foo/bar/access.log; error_log /foo/bar/error.log; } 참고로 Nginx 기본 로그 경로는 /var/log/nginx다. SELinux를 사용할 때는 아래와 같은 permission dined가 발생할 수 있다. [emerg] ... : open() "/foo/bar/access.log" failed (13: Permission denied) SELinux도 로그를 남긴다. /var/log/audit/audit.log경로에서 친절하게 찍어주고 있었다.. # tail /var/log/audit/audit..
Nginx | bind() to 0.0.0.0:8000 failed (13: Permission denied) SELinux가 활성화 되어 있는지 먼저 확인하면 좋다. enforcing 상태라면 아래 오류가 발생할 것이다.. Nginx를 실행하니 bind() to 0.0.0.0:8000 failed (13: Permission denied) 해당 오류가 확인됐다. 8000포트에 권한이 없어서 발생한 오류로, semanage를 이용해 http 포트를 추가해주어야 한다. 먼저 http port로 설정된 값들을 확인한 뒤, 사용하려는 포트가 없다면 추가해준다. # semanage port -l | grep http_port_t # semanage port -a -t http_port_t -p tcp 8000 Modifying SELinux Settings for Full NGINX and NGINX Plus Funct..