회원가입/로그인 기능을 개발하며 Access Token/Refresh Token 인증 방식을 적용하는 과정을 정리한 글입니다. 서론JWT 기반의 Access Token을 이용한 로그인 방식은 세션을 서버에서 관리하지 않아도 되기 때문에 서버 부담이 적은 편이다.또한 자체적으로 사용자 정보를 포함하고 있으므로 서버가 상태를 유지할 필요 없이 토큰만 검증하면 되기 때문에 요청마다 사용자 인증을 빠르게 할 수 있다는 장점이 있다. 그러나 사용자가 http 헤더로 보내는 토큰을 기반으로 유저가 판단되기 때문에 공격자에 의해 토큰이 탈취당할 경우, 이 토큰이 만료될 때까지 공격자가 사용자의 권한을 가질 수 있으므로 보안적으로 매우 위험하다고 볼 수 있다. 그렇기 때문에 Access Token의 유효 기간을 짧게..
이전에 iOS 개발을 하면서 사이드 프로젝트를 하나 만든게 있다.가까운 곳에 레코드 샵이 있으면 LP판을 구경하러 종종 가고는 하는데장르별로 무수히 많은 레코드 판들 중에서 뭐가 뭔지 하나도 모르는 경우가 많다.청음할 수 있게 옆에 턴테이블을 구비해둔 곳도 많지만 누군가 쓰고 있을 때에는 기다리기도 애매하다.그래서 답답한 마음에 내가 직접 쓰려고 만들었다. 카메라로 LP판의 바코드를 스캔해서 해당 음반의 정보를 확인하고, 타이틀 곡의 링크를 통해 어떤 음악인지 빠르게 파악할 수 있다. 최근 들어 Spring 공부를 하며 해당 애플리케이션의 서버를 만들어 앱과 연동하면 괜찮겠다 싶은 생각이 들었다. 일단은 작은 규모로 시작하겠지만 개인화 추천 서비스도 만들고 싶은 마음이다. 소개 https://gith..
구간 합 구하는 방법은 합 배열의 개념을 이용해서 해결할 수 있으나 이번 문제와 같은 경우, 중간 중간 수가 자주 변경되는 상황이 일어나기 때문에 합 배열로 풀기에는 시간이 오래 걸린다는 단점이 있다. 그렇기에 이와 같은 문제는 세그먼트 트리를 이용해 풀이하는 것이 권장된다. (세그먼트 트리의 경우, 개념 이해하는게 꽤 오래 걸렸으나 그래도 문제와 예제를 통해 세그먼트 트리 문제임을 알아채기가 편하다고 느껴졌다(?). 풀이 공식같은 것도 딱 정해져 있어서 차라리 그리디, 구현같은 것보다는 상대적으로 낫게 느껴진다..) 문제 예제 접근 트리 초기화하기 리프 노드의 개수가 데이터의 개수(N) 이상이 되도록 트리 배열을 만든다.트리 배열의 크기 구하는 방법 : 2^k >= N 을 만족하는 k의 최솟..
문제 풀이 4방향으로 탐색하며 인접한 칸 중 방문이 가능한 칸으로 이동하는 것을 보아 백준의 2178 미로찾기 문제와 비슷한 유형이라는 생각이 들었다. (BFS나 DFS로 풀이가 가능할 조짐이 보임.) 그러나 아래와 같은 추가적인 고려 사항이 있다. 1. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우반시계 방향으로 90도 회전바라보는 방향 기준 앞쪽 칸이 청소되지 않은 경우, 한 칸 전진=> 큐에서 받아온 방향을 기준으로 반시계 방향 회전한 방향으로의 좌표를 구해 이동한다 ex) 위 문제에서 주어진 방향값은 0(북), 3(서), 2(남), 1(동) 이다.만약 현재 방향이 0(북)이고, 반시계 방향으로 회전한다면 아래와 같이 반복된다. (순환) 0(북) -> 3(서) -> 2(남)..
문제 https://www.acmicpc.net/problem/14501 다음 문제에서 목표로 하는 최대 수익을 얻으려면 모든 가능한 선택지를 비교하고, 가장 높은 수익을 선택해야 한다.아래 문제를 보면, i일 이후에도 얻을 수 있는 최대 수익을 대략적으로 계산할 수 있다. 이러한 특징을 기반으로 현재를 최적화하는 방식에 적합한 DP 방식으로 풀이해보았다. 점화식 세우기 i번째 날에서 선택될 수 있는 결정은 두 가지로 구분될 수 있다. 오늘 시작되는 상담을 했을 때, 퇴사일까지 끝나지 않는 경우 (상담하지 못한다)오늘 시작되는 상담을 했을 때, 퇴사일 안에 끝나는 경우 (상담한다) i일에 상담 가능한 경우의 기준상담이 끝나는 날인 i + T[i] -1 일이 N 이하여야 한다.즉, i + T[..
로컬에서는 빌드가 잘 되는데 Github Actions에서 gradle build를 하면 위와 같은 에러가 나오는 경우가 있다.gradle-wrapper.jar가 커밋되지 않았기 때문에 GitHub Actions 환경에서 올바르게 로드되지 않을 가능성이 크다고 나와서 의심되는 부분을 살펴보았다. gradle-wrapper.jar 파일의 깃 누락이 의심되어서 .gitignore 파일을 수정하고 다시 돌려보았더니 똑같은 에러를 내뱉는다.(일단 임시적으로 jar로 끝나는 파일들을 gitignore에서 제외했다.) 이런 저런 방법들을 시도해 본 결과, ./gradlew --version을 실행하는데 그에 대한 Gradle Wrapper가 제대로 인식되지 않는 상황이었기 때문이라는 것을 확인할 수 있었다. (..
두 노드 사이가 길이가 가장 긴 값을 찾는 문제이다.임의의 지점에서 가장 먼 정점을 찾고, 다시 그정점으로부터 가장 먼 정점을 구하면 트리의 지름이 된다. 문제 임의의 노드 1에서 시작했다고 가정한 다음, 이전 연결 노드의 가중치를 합산해가며 노드 거리의 배열을 저장 한다. 그리고 가장거리가 먼 노드를 찾으면 그 정점에서 BFS를 재실행하는 방식으로 노드 거리 배열을 저장하며 답을 구한다. BFS 풀이package BFS;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;public class BOJ1167 { static ArrayList[]..
수열 A에 대해 버블 소트를 수행했을 때, swap이 총 몇 번 발생하는지를 알아내는 문제이다. N의 범위가 최대 500,000이기에 O(n^2)인 버블 소트로 풀이하면 시간 초과가 발생하는 문제가 발생한다. 여기서는 O(NlogN)의 시간복잡도를 가진 병합 정렬을 사용하여 풀이하였다. 두 그룹을 병합하는 과정에서 버블 정렬의 swap이 포함되어 있다는 것을 떠올리는게 포인트였다. 문제 문제 풀이 버블 소트에서 swap이 일어나는 조건 : 배열 앞의 숫자가 뒤의 숫자보다 클 때 (A[i] > A[i+n])result의 자료형을 처음에는 int로 설정했었으나 틀렸다는 결과가 뜨자 long으로 바꾸었더니 통과가 되었다.아마도 최악의 경우, n의 최대 범위에서 모두 swap이 일어나고, 그 swap 횟..