Technology 46

JWT 기반 인가에 대한 고찰

왜 JWT 의 장점을 버렸나요? 코드스쿼드 마스터즈 코스 과정에서 숙소 예약 서비스 팀 프로젝트를 진행하면서 미션 요구사항을 지키기 위해 세션이 아닌 JWT 을 통한 인가 기능을 구현해보았다. 더 나아가 JWT 에 대해 학습하면서 자연스럽게 access token 과 refresh token 에 대해 알게 되었고 access token 이 만료될 때 refresh token 을 검증하여 access token 을 갱신해주는 처리까지 구현해보았다. 이번에 구현한 대략적인 JWT 기반의 인가 과정은 아래와 같다. 나름대로 위풍당당하게 구현 뒤 리뷰어의 리뷰를 기다렸는데, 아니나 다를까 담당 리뷰어로부터 이에 대해 질문을 받았다. "JWT 의 장점인 '서버의 자원을 사용하지 않는다'를 포기하면서 refresh..

Technology/Web 2022.06.10

객체 생성 시 인스턴스 메서드는 힙 영역에 없다?

스태틱 영역에 존재하는 인스턴스 메서드 자바에서 new 연산자로 생성된 모든 객체는 JVM 내 단 하나의 힙(Heap)이라는 메모리 영역에 저장되어 모든 스레드가 이를 공유한다. 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며, 이러한 속성과 기능을 그 객체의 멤버라고 한다. 이때 객체 생성자를 통해 객체를 생성하면 클래스에 정의된 속성(인스턴스 변수)과 기능(인스턴스 메서드)이 모두 해당 객체와 함께 힙에 생성되었을 것이라고 생각했었다. 하지만 놀랍게도 인스턴스 변수는 힙 영역(해당 객체 내)에 존재하지만 인스턴스 메서드는 힙 영역에 존재하지 않고 스태틱 영역에 단 하나만 존재한다. 어떻게 이런 일이 일어날 수 있는 것인가? 변수와 달리 메서드는 변하지 않는다. 우선 변수의 특징은 애플리케이..

Technology/Java 2022.03.20

Scanner close 반드시 해야할까?

그동안 관습적으로 close를 사용하지 않지 않았었다. 그동안 나는 Java 프로그래밍을 하면서 Scanner(System.in)로 키보드를 통해 사용자로부터 입력 받은 값을 읽어올 때 관습적으로 close를 하지 않는 습관이 있었다. 이때 사용자로부터 입력 받는 값은 Stream을 통해 입력받게 된다. 그런데 이 Stream 인스턴스를 다 사용하고 나서 close하지 않아도 과연 괜찮을까? Java Stream 공식 문서를 살펴보자. 일단 자바 Stream 인터페이스에 대한 공식 문서에서는 Stream에 대해 다음과 같이 언급하고 있다. Streams have BaseStream.close() method and implement AutoCloseable, but nearly all stream ins..

Technology/Java 2022.02.15

정규 표현식을 통해 사용자 입력 데이터(이메일, 전화번호 등) 유효성 검사하기

정규 표현식이란? 정규 표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 웹에서는 주로 브라우저 단에서 사용자가 입력한 데이터가 올바르게 입력되었는지 검사(유효성 검사)하기 위해 정규 표현식을 사용한다. 만일 사용자가 회원 가입을 위해 ID, 비밀번호, 이메일, 전화번호 등을 작성하는데 중간에 실수로 데이터를 잘못 입력했다고 가정해보자. 사용자가 최종적으로 "완료" 버튼을 눌렀을 때(서버로 데이터가 전송되었을 때) 잘못된 데이터가 입력되었다면 페이지 리로드가 됨과 동시에 기존 작성했던 정보들이 초기화 되면서 다시 작성해야하는 불편함이 생긴다. 이때 사용자가 특정 항목에 대해 입력을 마치면 그때 그때 정규표현식을 통해 데이터 유효성 검사를..

서버에 이미지 파일 전송하기(feat. FormData, Ajax)

이미지 파일 업로드하기 웹 브라우저단에서 서버로 이미지 파일을 전송하고 싶은 경우에는 어떻게 할까? 우선 당연히 브라우저 단에 이미지 파일이 업로드가 되있어야 한다. 이때 HTML form 태그를 이용하면 되는데, form 태그 내 input 태그의 type을 file로 설정하여 이미지 파일을 업로드 받을 수 있다. 여기서 중요한 것은 form 태그의 속성값 중 enctype(인코딩 타입)을 "multipart/form-data"로 설정해주어야 한다는 것이다. 여기서 multipart란 웹 브라우저가 서버에 요청을 보낼 때 HTTP 프로토콜 바디 부분에 데이터를 여러 부분으로 나눠서 보내겠다는 것이다. 그러면 왜 굳이 데이터를 여러 부분으로 나누는 것일까? 그 이유는 HTTP Request Body에 들..