전체 글

개발자가 되어가는 기록 Github : https://github.com/JoHyoju04
· Backend/JWT
개발 환경 spring boot 3.0.2 spring security : 6.0.1 Gradle Spring Security를 통한 JWT 적용 JWT를 사용하기 위해 구현해야 할 것은 기본적으로 TokenProvider, TokenAuthenticationFilter이다. JWT 토큰 제공을 위한 TokenProvider HTTP Request에서 토큰을 읽어 들여 정상 토큰이면 Security Context에 저장하는 TokenAuthenticationFilter 그리고 Spring Security에 적용하기 위해 구현해야 할 것은 기본적으로 아래와 같다. 기본적으로 Spring Security 설정을 위한 SecurityConfig TokenProvider @RequiredArgsConstruct..
· Backend/JWT
목표 : JWT 인증/인가 과정을 구현 그 전에 Spring Security를 알아보자 들어가기 전에 Spring Security 스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크이다. 스프링 시큐리티는 이러한 필터들을 또 다시 하나로 묶어 하나의 인증 영역을 만들고 이를 SecurityFilterChain 객체로 관리한다. (기존에는 하나의 SecurityFilterChain을 구성하기 위해서 WebSecurityConfigurerAdapter를 상속한 클래스에서 config 메소드를 오버라이딩한다. 하지만 스프링 시큐리티 5.7.0 버전부터 WebSecurityConfigurerAdapter를 사용하지 않는다고 되어있다.) Spring Secur..
· Backend/JWT
들어가기 전에 인증과 인가 인증은 사용자의 신원을 입증하는 과정이다. 예를 들어 회사에 지문이나 신분증으로 회사 사람인 것을 입증하는 것이다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 내가 회사원이라고 해도 모든 곳에 접근 가능한 것은 아니다. 보안 담당자만이 접근할 수 있는 사무실은 들어가지 못한다. 일반 사원, 보안 담당자등 권한에 따라 접근할 수 있는지가 다르다. JWT는 왜 필요할까? 인증/인가 방식 중에 하나이다. stateless하므로 서버가 상태를 보관하고 있지 않은 특징이 있다. 서버는 한번 발급한 토큰에 대해서 제어권을 가지고 있지 않다. 그런데 JWT는 외부에 노출되는 경우 치명적인 보안 이슈가 발생할 수 있다. 서버는 탈취한 것을 알지 못한채..
· Backend/Java
들어가기 전에 서버에서 서버로 RestTemplate을 이용하는데 Json에서 Dto로 변환할 때(역직렬화) 이슈가 있었다. 이때 직렬화, 역직렬화에 대한 개념을 정리하고 과정에서 생긴 이슈를 분석하고자 한다. 여기에서 사용된 코드는 실제 회사에서 사용한 코드는 아니며, 포스팅을 위해 최대한 유사하게 만들어진 별도의 샘플 코드이다. 스프링에서의 직렬화와 역직렬화란? 스프링 HTTP 요청 / 응답 과정에서 자바 객체 ↔ JSON 간에 변환을 하는 것이 직렬화와 역직렬화이다. HTTP 응답은 서버 → 클라이언트 흐름이기 때문에 자바 객체 → JSON 변환인 직렬화 과정이고, HTTP 요청은 클라이언트 → 서버 흐름이기 때문에 JSON → 자바 객체 변환인 역직렬화 과정이다. 즉, ResponseDto를 HT..
· CS 공부
들어가기 전에 - Servlet이 생긴 배경 초기 웹 서비스에는 클라이언트에게 정적인 페이지만 제공하다가 웹이 발전하면서 사용자마자 요청을 다르게 처리해야했습니다. 이때 Web Application Server라는 동적 컨텐츠를 제공해주는 서버가 생겨 클라이언트의 요청을 다양하게 처리할 수 있게 되었습니다. 여기서 WAS내에 동적 컨텐츠를 생성하는데 사용되는 기술 또는 객체가 Servlet입니다. Servlet이란? 동적 컨텐츠를 만드는 데에 사용되는 자바 기반의 웹 어플리케이션 프로그래밍 기술 혹은 그 기술에서 사용되는 객체 public interface Servlet{ void service(ServletRequest var1, ServletResponse var2) throws ServletExce..
들어가기 전에 추상 클래스를 썼을 때 타입을 추상클래스로 정의해두면 그 타입에 기능을 추가하는 방법은 상속뿐이다. 자바는 단일 상속만 지원하므로 추상 클래스는 새로운 타입을 정의하는데 제약이 있다. 인터페이스의 장점 장점1 : 계층구조가 없는 타입 프레임워크를 만들 수 있다. -다중 구현가능 -계층을 엄격히 구분하기 어려운 개념 표현 가능 -확장하여 제 3의 인터페이스를 정의할 수 있다. public interface Singer{ AudioClip sing(Song s); } public interface Songwriter{ Song Compose(int chartPosition); } public interface SringerSongwriter extends Singer, Songwriter{ A..
상속 public class cat extends animal{ //... do something } 상속 관계에서 상위 클래스를 변경하면 코드 손상의 위험이 있다. 상속을 통해서 생성된 Class와 Objects는 밀접하게 결합되어 있다.(tightly coupled) 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다. 컴포지션 컴포지션(Composition)은 구성요소라는 뜻으로 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻이다. public class House { private Bedroom bedroom; private LivingRoom livingRoom; //... do something } private ..
들어가기 전에) 객체를 생성할 때 멤버변수가 5개 이상일때 매게변수를 하나하나 다 넘겨주거나 set을 하는 경우가 있지 않은가? 예시를 보면서 문제점을 생각해보자. 식품포장의 영양정보를 표현하는 클래스를 생각해보자. public class NutritionFacts { private final int servingSize; //(ml, 1회 제공량). 필수 private final int servings; //(회, 총 n회 제공량). 필수 private final int calories; //(1회 제공량당). 선택 private final int fat; //(g/1회 제공량). 선택 private final int sodium; //(mg/1회 제공량). 선택 private final int car..
들어가기 전에 객체를 만들 때 new 생성자를 이용한다. 하지만 프로그래머는 생성자의 매개변수만을 보고 어떤 객체가 반환될 것인지 예측하기 어렵다 정적 팩토리 메서드를 사용해서 생성자 대신 사용해보자! 정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메서드로 생성자(Constructor)를 통해서가 아닌 Static Method를 통해서 객체를 생성하는 역할을 한다. 여기서 팩토리는 객체를 생성하는 역할을 분리한 것이라고 한다. 디자인패턴인 팩토리 메서드 패턴과 관련이 없다. 예시를 들어서 먼저 확인 new로 선언 String 객체를 선언할 때 new를 이용한다. String str = new String("hohodu"); valueOf와 같이 메소드 이용 String value1 = String..
· Backend/Java
비교 == (동일성 identity 비교) 객체의 주소값 비교로 같은 메모리 공간을 가리키는지 확인 equals (동등성 equivalence 비교 ) 객체의 내부 값이 같은지 비교한다. 객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다. 여기서 클래스는 속성과 행위로 구성된 일종의 설계도이다. OOP에서 객체는 클래스와 인스턴스를 포함한 개념이다.(위키피디아) 그렇기 때문에 정확히 표현하면 인스턴스겠지만 여기서는 객체라고 하겠다. equals() public class Money { int amount; String currencyCode; public Money(int amount,String currencyCode){ th..
호_두씨
Hodu's workspace