본문 바로가기

개발

(32)
[Java] 토큰 인증 처리에 대한 정리 문제 제기토큰 인증 관련 글들을 보면 jwt의 만료 기간만 보고 인증을 결정하는 내용들을 자주 봤다.이 경우 인증을 stateless 하게 관리해 성능상의 이점이 있지만 로그아웃된 토큰 or 토큰이 탈취됐을 때에 대해선 대응이 부족한 것 같단 생각이 들었다.서비스 신뢰도나 최악의 상황을 고려하면 인증 관련 정보는 stateful로 관리하는 게 맞는다고 생각해 여기에 맞춰 토큰 인증을 만들었다. 2가지 토큰으로 인증을 처리한다.access 토큰: 실제 인증에 사용되는 토큰. 기간이 짧다.refresh 토큰: access 토큰 만료 시 갱신에 사용되는 토큰. 기간이 길다. 인증 EntityEntity를 생성하고 access, refresh 토큰과 memberId를 넣는다.디테일을 위해 넣은 거지만 @PreP..
[Python] 키워드 인자에서 **kwargs 주의점 쓰게 된 이유파이썬 **kwargs, *args이라 검색만 해도 관련 내용이 많이 나온다.하지만 키워드 인자를 사용한 예시는 내 기준 구글 1~2페이지에선 보이지 않았고 다 비슷한 내용들이었다.개념만 슥 보고 넘어가기엔 이후에 팀원들도 같은 실수를 할 수 있다 생각해서 공유하기 전에 생각을 정리하기로 했다. 급한 분들을 위해 요약하면**kwargs에 키워드 인자를 사용하면 키워드 인자도 딕셔너리에 들어간다**kwargs인수를 딕셔너리 형태로 만든다.하지만 키워드 인자처럼 사용하면 이런 결과가 나온다.def test1(**kwargs):    print(kwargs)    passdata = {'A': 1, 'B': 2}test1(kwargs=data)결과{'kwargs': {'A': 1, 'B': 2}}..
리눅스 환경에서 버전 관리 한 줄 요약: 블로그 명령어 믿지 말자. 할 거면 링크 주고 이 사이트 보고 진행하겠다고 말하자서론팀 문서를 보고 작업하다 버전 업이 필요하단 부분이 있었다.블로그에서 버전 업에 관한 포스팅을 찾아보고 진행하던 중 굳이 이렇게 해야 하나? 싶은 부분이 있었다아무리 생각해도 좀 아닌 거 같아서 물어봤지만, 이미 이전 명령어를 수행했던 시점에서 문제가 발생해버렸다.apt-get(yum)? wget?패키지 설치 시 apt-get이나 wget으로 설치하는 글 2가지로 나뉜다. 예외가 있겠지만 대부분의 상황에선 wget이다.만약 서버에 구 버전이 있는 경우 버전업 하지 말고 wget으로 다운로드한 폴더의 bin에 들어가서 해당 버전에 맞춰 레포를 빌드하거나 실행하자 apt-get 은 삭제해도 잔존물이 남아있거나 ..
서버에서 rm 실수를 줄일만한 방법 들어가기 전에특정 상황에선 필요 없는 파일을 지워서 공간을 확보하겠지만 내 기준 대부분의 상황에서는 파일을 지우기보단 손 안 닿는 곳에 옮겨두는 게 낫다 생각한다. 즉, 저장공간 차지하는 문제가 삭제로 발생하는 문제보다 덜 위험하다 생각한다 주의할 점리눅스를 바닐라로 설치할 때 /etc 내부 설정 파일들에 이 방법을 쓰면 매우 위험하다그 쪽을 만질 상황이 오진 않겠지만 가끔 몇몇 블로그들을 보면 극단적인 방법들을 소개하기 때문에 해당 파일들을 만지게 된다면 반드시 상급자한테 물어보자1. 메모장에 적고 복사하기생각보다 탭 자동완성으로 인한 실수가 잦다. 특히 명령어 순서나 철자 하나 빼먹는 경우 많다2. mv [삭제할 파일] ~/trash리눅스엔 휴지통이 없다. 홈 디렉토리든 어디든 휴지통 역할을 하는 디..
[Java] 무지성으로 final 쓰지 않기 문제 제기코드 리뷰 과정에서 immutable 을 아는지란 질문을 받았다.처음엔 final 키워드를 사용해 불변으로 만드는 것이라 생각했었다.하지만, 컬렉션을 사용할 때 immutable을 제대로 보장하지 않는다는 걸 알게 됐다.한 줄로 요약하면 뒷문이 열려있었다고 보면 된다. immutable을 보장하는 방법은 다음과 같다.클래스의 하위 클래스화 방지setter 메서드 사용 X외부 참조를 취하는 생성자 관리final 객체 참조를 반환하는 Getter 처리모든 필드에 private final 사용왜 final을 쓰나?1. gc 오버헤드를 감소시킬 수 있다.오버헤드가 주제가 아니라 더 다루진 않는다.링크: https://docs.oracle.com/javase/tutorial/essential/concur..
자바가 엔진단에서 어떻게 동작할까 큰 흐름은 다음과 같다. JIT 컴파일러 (Just-In Time Compiler) 인터프리터에서 읽은 코드를 또 읽으면서 생기는 부하 문제가 있다. 해결 수단으로 메서드를 다시 읽지 않고 JIT 호출을 통해 기계어를 바로 읽는다. 관련 기술인 JRockit 기준 스레드를 모니터링해 자주 사용되는 메서드의 기계어를 저장해놓는다. 자주 사용되는 메서드라 판별될 때 까진 인터프리터가 바이트코드를 한 줄씩 해석하는 문제가 있다. 즉, 재시작 등에서 발생하는 콜드 미스의 비용이 매우 크다. 네이티브 컴파일러와 차이? C의 경우 .exe, .elf 같은 형태로 디스크에 저장되지만 Java의 JIT는 JVM의 메서드 영역에 저장된다. 즉, 휘발성이다. 메서드 영역에 어떤 형태로 저장됐는지는 관련 문서가 없어 알 수..
redis 2.0 분석 들어가기 전에 Redis 2.0 버전을 기준으로 작성한 글입니다. 해당 버전의 코드는 다음 링크에서 확인하실 수 있습니다. http://redisgate.kr/redis/introduction/redis_release2.php Redis Release Notes 2 redisgate.kr 해시 테이블 resize 해시 테이블을 resize 하는 과정에서 데이터를 옮겨야 하기 때문에 다른 요청을 수행할 수가 없다. 이를 해결하기 위해 2버전에선 db 당 해시 테이블을 2개로 만들어 관리한다. 0번 해시 테이블이 메인이지만, resize가 된 시점부터 1번 해시 테이블이 메인이 된다. 데이터를 모두 옮기면 1번 해시 테이블이 0번으로 변환된다. 이 작업은 cron을 통해 주기적으로 옮기거나 조회, 삽입, 수..
[java] Spring 애플 로그인 구현 과정 애플 로그인은 구글이나 국내 소셜 로그인과는 다른 방식으로 구현해야 한다. 관련 포스트를 참고해 구현했지만, 일부 포스트는 필요 이상으로 의존성을 사용했고 무엇보다도 내 방식으로 정리를 해놔야 나중에 애플 로그인이 기억나지 않을 때 빠르게 이해하려고 작성했다. swift와 Java Spring Boot를 사용했고, 내 역할은 백엔드였기 때문에 swift 코드는 올리지 않는다. 애플 소셜 로그인 구조 다른 로그인이 인증 서버에서 받은 토큰을 가지고 리소스 서버에 요청하면 사용자가 제공하기로 한 정보를 얻는다. 애플 로그인의 경우 id_token 이란 jwt 토큰을 주고 백엔드에서 이 토큰이 애플에서 만든 토큰인지 검증하고, Claim을 추출해 사용자 정보를 가져온다. 1, 2 번은 IOS에서 담당할 부분이..