전체 글 13

BE (3) - Express 백엔드 token 관련 해킹 예방하기

Access Token 의 문제점 여기서 지칭하는 Access Token은 단순히 아래 코드와 같이 jwt.sign() 을 이용해 반환받은 auth 관련 token 입니다. const accessToken = jwt.sign(userObject, secretKey); Refresh Token을 사용하지 않는 Express backend는 jwt.sign()을 통해 반환받은 Access Token이 하나만 있다면 해당 token을 갖고 계속 인증이 필요한 요청을 수행할 수 있습니다. jwt.sign()은 실행할 때마다 다른 token을 반환하지만 기본적으로는 과거에 반환한 token은 만료가 되지 않기 때문에 보안 상 관리하기 까다롭습니다. 임시 해결법 jwt.sign()으로 token을 발행할 때 tok..

개발 2024.01.31

BE (2) - PUT vs. PATCH

HTTP method는 기본적으로 서버에 어떤 작업을 수행할 것인지에 대한 정보를 전달하기 위해서 사용됩니다. 데이터를 서버에서 받아올 때 사용하는 GET method, 데이터를 서버에 등록할 때 사용하는 POST method, 서버에 있는 데이터를 삭제하기 위해 사용하는 DELETE method 등이 있습니다. 여러 method 들 중에서 데이터를 수정할 때 사용하는 method는 PUT 과 PATCH 두 가지가 있는데 이 둘의 차이점에 대해서 알아보도록 하겠습니다. PUT method 데이터를 '수정'한다는 느낌보다는 '교체'라는 단어가 더 잘 들어맞습니다. 데이터의 모든 필드의 값을 입력해야 되고 데이터 전체가 교체됩니다. //PUT { "username": "dongsunseng", "email"..

개발 2024.01.25

BE (1) - res.json() vs. res.send() vs. res.end()

res.json() vs. res.send() 기능상으로 수행하는 작업은 거의 동일합니다. res.json() 와 res.send()로 object를 보냈을 때의 차이점 object를 보내는 작업을 처리하는 순서에서 차이가 있습니다. res.json(): 1. 전달하려는 object를 문자열로 stringify합니다. 2. 만약 Content-Type header이 세팅되지 않았을 경우 res 객체의 Content-Type header를 this를 사용해서 "application/json"으로 세팅 해줍니다. 3. res.send()를 사용해서 stringify해준 object를 보내줍니다. → 1. res.json(object) 2. res.send(string) res.send(): 1. res.se..

개발 2024.01.24

복귀 - 2024.01.12

이전 포스트에 블로그를 꾸준히 해보겠다는 포부를 보였지만 갑자기 잠수를 탔었던 이유와 앞으로의 계획에 대해 말해보려고 한다. 일단 이번 학기는 학교 공부를 좀 열심히 해봐야겠다는 생각이 있었다. 뉴욕 본교에서 첫 학기여서 잘하고 싶기도 했고, 이번 학기는 장학금을 받고 싶다는 생각이 있었다(엄마의 무언의 압박 ㅋㅋ). 열심히 한 결과 나름의 성과는 있었다. 성적도 잘 나와서 장학금을 받을 수 있을 것 같고 이번학기는 사이드 프로젝트로 전에 만들었던 학교 수강평 웹사이트를 React Native로 모바일 앱으로 만들었다(85% 정도 완성). 이에 대한 자세한 내용은 '학교 수강평 사이트 개발 및 운영 도전기' 시리즈에서 다시 다루도록 하겠다. 앞으로의 계획 일단 졸업까지 한 학기를 남겨두고 있고 졸업 후에..

카테고리 없음 2024.01.13

ML/DL - Code CheatSheet

Numpy 1. __version__ : 버전 확인 import numpy as np print(np.__version__) 2. array() : 배열 만들기 my_arr = np.array([10, 20, 30], [40, 50, 60]) 결과값: [[10, 20, 30], [40, 50, 60]] 3. sum() : 배열의 각 요소를 모두 더한 값을 반환하기 넘파이 배열은 + 와 * 을 배열의 각 요소를 더하고 곱하는 작업이 가능하다. a = np.array([1, 2, 3]) b = np.array([3, 4, 5]) print(a + b) #결과값: array([4, 6, 8]) print(a * b) #결과값: array([3, 8, 15]) np.sum() 함수에 a * b를 전달하면 넘파이..

카테고리 없음 2023.07.22

캐글 도전기 (2) - 7/5 ~ 7/14

캐글에 대해 알게된 점: 1.0은 불가능하다 일단 캐글에 대해 새롭게 알게 된 점 한 가지가 있는데 캐글 뉴비들에게는 나름 헷갈릴 수 있을 것 같아서 짚고 넘어가려 한다. 캐글을 시작하면 타이타닉이나 주택가격예측 대회를 자연스럽게 거쳐가게 된다. 각 대회에 리더보드를 확인해보면 1.0의 정확도를 받은 사람들이 굉장히 많다는 것을 확인 할 수 있다. 이를 보고 글쓴이는 1.0의 정확도를 받는 것이 이 대회를 완벽하게 이해하고 더 정교한 데이터 전처리와 모델링을 통해서 나오는 이상적인 결과라고 생각했고 이를 위해 한참을 다른 사람들의 코드를 보며 연구했다. 그러던 중 놀라운 결과를 알게 되었는데 1.0의 정확도가 나오는 것은 불가능할 뿐만 아니라 이 대회의 목적이 아니라는 것이었다. 정확도라고 함은 학습 데..

카테고리 없음 2023.07.18

ML/DL(3) - 손실 함수와 경사 하강법의 관계

손실함수와 경사 하강법의 관계를 공부하며 헷갈리고 정확히 무슨말인지 이해가 안 가는 부분들이 있었는데 이들을 짚고 넘어가려 한다. 1. 왜 가중치와 절편을 업데이트하는데에 손실함수를 미분한 값을 사용하는가 선형 회귀의 손실함수는 '제곱 오차(squared error)'로 예측값과 타깃값의 차이를 제곱한 것이다. 이때 제곱 오차가 최소가 되면 데이터의 경향을 가장 잘 표현하는 직선을 찾을 수 있는 것이다. 따라서 제곱 오차 함수의 최솟값을 알아내야 하는데 제곱 오차함수는 2차 함수이므로 기울기에 따라 함수의 값이 낮은 그래프의 최소에 가깝게 이동해야한다. 2차 함수인 이유는 아래와 같이 정리해보면 알 수 있다. x축을 가중치 $w$ 혹은 절편 $b$로 두고 y축을 손실함수로 두었을 때 손실함수의 최소로 이..

카테고리 없음 2023.07.08

ML/DL(2) - 오차 역전파(backpropagation)

'오차 역전파'라는 단어를 이해하는 것은 이 분야를 공부하면서 본인을 처음 흠칫하게 한 부분이었다. 나 같은 입문자가 이해하기 위해서는 부가적인 설명이 필요하다고 생각되는 부분이므로 정리하고 넘어가야겠다. 정방향 계산 일단 쉬운 정방향 부터. '정방향 계산'이란 $ \hat{y} $ 을 구하는 과정을 말한다. 그냥 $ b + \sum_{i=1}^{n}w_{i}x_{i} $ 의 계산이다. 역방향 계산 '역방향 계산'이란 정방향 계산으로 구한 $ \hat{y} $와 $ y $의 오차를 통해 $ w $와 $ b $의 변화율(gradient)를 계산하는 과정이다. 이를 뉴런을 이용한 그림으로 나타내면 아래와 같이 표현할 수 있다. 여기서 책이나 강의를 보면 "오차가 뉴런의 오른쪽 방향에서 왼쪽 방향으로 흐르는 ..

카테고리 없음 2023.07.08

ML/DL(1) - 로지스틱 회귀의 활성화 함수로 비선형 함수를 사용하는 이유

로지스틱 회귀는 이름에 '회귀'라는 단어가 들어가서 선형 회귀 등과 비슷한 알고리즘으로 착각할 수 있으나 분류 알고리즘이다. 로지스틱 회귀에 대한 기본적인 내용을 안다는 전제 하에 로지스틱 회귀의 활성화 함수로 비선형 함수를 사용하는 이유에 대해 알아보자. 활성화 함수? 로지스틱 회귀에서는 위의 이미지에서 볼 수 있듯이 선형 함수의 결과로 얻은 결과 값(z)를 변형시켜서 임계함수(threshold function)에 보내게 되는데 이 역할을 수행하는 함수를 활성화 함수(activation function)이라고 한다. 이후 활성화 함수를 통과한 값(a)를 임계함수에 넣어서 예측을 수행한다. 로지스틱 회귀에서 사용하는 활성화 함수는 '시그모이드 함수'로 비선형 함수인데 z 값을 0~1 사이의 값으로 변형시..

카테고리 없음 2023.07.08