목록백앤드 개발일지 (66)
늘
jwt 토큰이란 JWT(JSON Web Token)는 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 토큰이다. 이 정보는 디지털 서명되어 있으므로 확인하고 신뢰할 수 있습니다. JWT는 HMAC 알고리즘을 사용하거나 RSA 또는 ECDSA 를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다. 한가지 오해 처음에 jwt를 공부할 때, 어차피 디코딩하면 헤더에서 토큰 타입이나 알고리즘을 알 수있는데 왜 서명을 하는가였다. 그이유를 설명하자면 jwt의 서명의 목적을 생각해야한다. 디지털 서명되어 신뢰할 수 있는 이유는?(서명하는 이유) JWT 토큰은 자체적으로 토큰 유효성 검사가 가능하다! 즉, HMAC또는 RSA와 같은 공개 또는 비대칭키를 통해 서명하기 때문이다. 단순히 JWT토큰을 ..
스프링과 JPA로 애플리케이션을 개발하다 보면 프록시에 대해서 많이 만나게 된다. 이와 관련되어 구글링을 해보면 게시글들마다 다른 말을 해서 직접 정리해보려고 한다. - 총정리 스프링 AOP는 [런타임에 프록시 인스턴스가 동적으로 변경되는] 다이나믹 프록시 기법으로 구현되어있다 인터페이스의 유무에 따라 다음과 같이 나뉜다. 1. JDK 다이나믹 프록시 2. CGLIB JDK Dynamic Proxy JDK에서 지원하는 프록시 생성 방법 Invocation Handler를 재정의한 invoke를 구현하여 부가기능 수행 Reflection API 사용 인터페이스를 통해서만 프록시 생성 가능 CodeGenratorLibrary(CGLIB) 상속을 기반으로 프록시 생성 final이 붙으면 오버라이딩이 불가능하므..
인텔리제이에서 지원하는 .http라는 파일을 만들면 포스트맨을 대체하여 매우 편리했던 경험이 있었다. 이러한 경험을 글로 정리해서 공유해보려고 한다. 장점 포스트맨을 사용했을 때는 매번 테스트 해볼때마다 복붙을 했었지만, .http라는 파일로 관리하여 저장할 수 있다. Code highlighting이 가능해서 더욱 직관적이다. 코드 자동 완성의 기능들이 있다. 단점 음..굳이 뽑자면 파일이기 때문에 관리를 해야 한다? 인 것 같다. POST 요청 위 처럼 POST로 요청을 보낼 때, Content-Type을 명시해주고 한 칸 띄우고 json형식으로 입력해주면, 테스트용 디비에 아래처럼 잘 들어간 것을 확인할 수 있다. 그리고 로그인에 성공을 하면, accessToken도 잘 나오는 것을 확인할 수 있다..
단방향 해시 함수(one-way hash function)의 다이제스트(digest) 보통 단방향 해시 함수는 수학적인 연산을 통해 원본 메시지를 변환하여 암호화된 메시지인 다이제스트를 생성한다. 원본 메시를 안다 -> 암호화된 메시지를 알 수 있다. 암호화된 메시지를 안다 -> 원본 메시지를 모른다. 한쪽으로만 알 수 있으므로 이와 같은 처리를 '단방향성'이라고 한다. 단방향 해시 함수는 예를 들어 비밀번호가 asd일 때, 해시 알고리즘인 SHA-256을 이용하여 암호화할 때, f52bvs32c2f3f86kk88vc6c490628285a482af15ascb19541d54saz526a3f6c7 와 같이 나온다면 asd1을 암호화하면 fb8c2e2b85ca81eb4350199faddd983cb26af306..
Spring REST Docs는 테스트가 통과해야 문서화가 된다. API문서 자동화에는 대표적으로 swagger와 Rest docs가 있는데 개인적으로 RestDocs를 선호한다. 장점 Spring REST Docs는 테스트가 성공하지 않으면 문서를 만들 수 없습니다. 즉, 반 강제로 테스트를 해야 하고 이를 통해 신뢰도 높은 api문서가 나온다. 실제 코드에 추가되는 코드가 없습니다. - swagger를 보면 프로덕션 코드에 어노테이션이 덕지덕지 붙어있는데, 이는 관심사의 분리가 실패된 케이스가 아닌가.. 라는 생각이 들어서 RestDocs를 선호한다. 커스터마이징 가능 문서화에 사용할 테스트 도구 여기서 API문서화 할때는 Controller테스트를 통해서 생성하므로 RestAssured보다는 Moc..
@Mock @ExtendWith(MockitoExtension.class)를 클래스 위에 붙여준다. @ExtendWith(MockitoExtension.class) public class MockTests { @Mock private OrderRepository orderRepository; @InjectMocks private OrderService orderService; } @InjectMocks를 사용하면 @Mock으로 만들어진 인스턴스들을 자동으로 주입해준다. (위 예시에서는 OrderService가 OrderRepository를 주입받는 클래스 존재) @MockBean @SpringBootTest public class MockTests { @MockBean private OrderReposi..
빈이 생성된 이후 추가로 호출되는 콜백들이 있는데요. Spring bean lifecycle, Spring bean hook 같은 키워드로 검색해보시면 도움이 될 것 같아요! 저번에 테스트 격리에 대해 학습하면서 토미가 키워드를 주셨는데, 오늘은 이 키워드를 정리해보려고 한다. 빈 생성 IoC컨테이너가 만들어진다. -> ComponentScan을 통해 빈으로 등록할 객체들을 찾는다. IoC 컨테이너 안에 빈을 등록한다. 그리고 의존관계 주입을 하기 전에 준비 단계가 있다. 이 준비 단계에서 객체 생성이 일어난다. 생성자 주입: 객체의 생성, 의존관계 주입이 동시에 일어남 setter, Field 주입: 객체의 생성 -> 의존관계 주입으로 라이프 사이클이 나누어져 있음 스프링 의존관계 주입이 완료된 시점 ..
Reflection API란? 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API다. 사용하는 Library, Framework, API, Feature Jackson, GSON 등의 JSON Serialization Library Log4 j2, Logback 등의 Logging Framework Apache Commons BeanUtils 등의 Class Verification API Spring의 @Autorwired와 같은 DL, DI 기능 (: processInject(), inject() Method ) Spring Contatiner의 BeanFactory에서 사용 내부적으로 Spring의 ReflectionUtils라는 A..
서블릿을 만들려면 HttpServlet 클래스를 상속받으면 되나? - 서블릿 프로그래밍의 핵심은 Servlet 인터페이스를 이해해야 한다. 서블릿 웹 브라우저 웹 서버 웹 애플리케이션에서 웹서버와 웹 애플리케이션 사이에서 CGI규칙에 따라 데이터를 주고받는다. 자바로 만든 CGI 프로그램을 서블릿이라고 부른다. 서블릿 컨테이너(톰캣) 이런 서블릿의 생성, 실행, 소멸 등 생성 주기를 관리하는 프로그램을 서블릿 컨테이너라고 한다. 서블릿은 한 번 생성되면 웹 애플리케이션을 종료할 때까지 유지한다. 서블릿 컨테이너가 서블릿을 대신하여 CGI 규칙에 따라 웹 서버와 데이터를 주고받는다. 따라서 개발자는 더 이상 CGI규칙에 대해서 알 필요가 없다. 대신 서블릿 컨테이너와 서블릿 사이의 규칙을 알아야 한다. 서..
ResponseEntity의 body에 객체를 넣고 보내주면 json형식으로 주고받아진다. @Controller public class HelloController { @GetMapping(path = "/hello") public ResponseEntity hello() { MoveDto moveDto = new MoveDto("start", "finish"); return ResponseEntity.ok(moveDto); } } @Controller를 통해서 Json이 반환되는 현상이 발생했습니다.. 흔히들 알기론 controller는 데이터를 Model에 담고 반환할 view를 찾는 방식이고 restController는 단순히 json형식의 데이터만 주고받는 것으로 알고 있습니다. 그리고 RestC..