JDBC는 java에서 Java.sql패키지에 내장되어 있는 DB 프로그래밍을 하기 위한 API이다. JDBC는 Java Application으로부터 사용되는 JDBC Driver Manager와 DBMS에 의존하는 JDBC Driver를 분리함으로써 DBMS에 의존하지 않고 개발이 가능하다는 장점이 있다. MySQL, Oracel 등 사용하는 DB의 Driver를 설치한 뒤 JDBC Driver Manager에 등록하면 Application에서 수행되는 SQL형태의 Query를 Driver가 DBMS가 이해할 수 있는 Query로 변환하여 전달한다. JDBC로 특정 쿼리문이 수행되기까지의 과정이 있다. 1. JDBC Driver 로드 2. DB 연결 3. Create a statement 4. 쿼리 처..
ORM ORM에 들어가기 앞서, Persistence 속성에 대해 먼저 알아보자. 영속성(Persistence) 특성은 프로그램이 종료되더라도 사라지지않는 비휘발성 데이터라는 특성을 말한다. 만약, 영속성 특성이 없는 데이터(휘발성)는 메모리상에서만 존재하기 때문에 프로그램이 종료되면 모두 날라간다. 1) Object Persistence(영구적인 객체) 메모리 상의 데이터를 file system, RDB(관계형 데이터베이스) or 객체 DB를 활용하여 영구적으로 저장(영속성) - java에서는 JDBC사용 - Spring JDBC - Hibernate, Mybatis 등의 프레임워크 이용 2) Persistence Layer 프로그램 상의 아키텍처에서 데이터에 영속성을 부여하는 계층이다. - JDBC를..
h2는 java기반의 오픈소스 RDBMS이다. 가볍게 사용할 수 있기 때문에 개발 단계의 테스트 db로서 많이 이용된다고 한다. h2 설치파일을 다운받아서 하는 방법도 있지만, 나는 코드상으로만 이용하고자 한다. builc.gradle에 아래 추가 dependencies { // jdbc implementation 'org.springframework.boot:spring-boot-starter-jdbc' // jpa implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // spring boot implementation 'org.springframework.boot:spring-boot-starter-web' implementa..
기본적으로 JWT양식을 작성할 때에는 탈취당했을 때를 대비하여(탈취를 안당하면 가장 좋지만) 보안상 문제가 되지 않는 수준까지의 정보만 담아야 한다. (비밀번호 같은 것을 Payload에 담게 된다면 큰일이겠지...) 만료시간 : 15분 아래 각 부분마다 base64인코딩 1. 헤더(Header) { "typ": "JWT", "alg": "HS256" } 2. 정보(Payload) { "iss": "우리 도메인", "iat": "현재 시각" "exp": "현재 시각 + 15분", "공개 클레임(public claim)": true, "userId": "유저 id", } 3개의 등록된 클레임(iss, iat, exp) 1개의 공개 클레임 1개의 비공개 클레임(userId) 3. 서명(Signature) 헤..
진짜 뭔놈의 에러가 이렇게 많지.... o.s.b.d.LoggingFailureAnalysisReporter application.properties에 아래 두 문구를 추가 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration server.port=9090 Consider defining a bean of type 'com.study.study_project.mapper.UserMapper' in your configuration. application 파일에 아래 오너테이션 추가(매퍼 경로) @MapperScan(basePackages = {"com.study.study_pro..
JWT를 사용했을 때, DB나 Cache를 두지 않았다고 가정을 해보자.(완전히 stateless한 서버를 구성) 중복 로그인 처리 웹 서비스를 운영 중에 있을때, 사용자가 동시에 여러 곳에서 로그인을 할 수 없게 하려고 한다. ex) 기존에 A가 로그인을 한 상태에서 B가 로그인을 시도하면 A를 만료시킴 만약 세션을 서버에서 관리하고 있다면 서버에 저장되어 있는 해당 사용자의 세션을 초기화시키면 된다. 그러나 JWT를 이용한다면 서버는 현재 아무런 정보가 없는 상황이다. 따라서, 위 예시에서 B가 로그인을 시도해도 중복 로그인인지 확인할 수 있는 방법이 없다. (그렇다고 누군가 중복 로그인을 한 것 같다는 소식이 들려왔을 때 전체 토큰 세션을 날려버릴 순 없다...) 보통 만료시점을 넣어두지만 만료시점..
세션 Client가 Server로 로그인 요청을 하면 Server에서 세션을 생성하고 로그인이 정상적으로 처리되었다는 응답을 하게 된다. 그렇게 로그인이 성공한다. 현 상황에서 세션은 유지되고 있다. 이후, Client에서 서비스 요청 등을 Server로 하게되면 인증된 유저인지 확인하기 위해 Session을 읽는다. 해당 유저가 확인이 되면 정상 응답을 Client로 해준다. 만약 서버가 1대인 서비스라면 신경쓸 일이 적지만, 보통은 서버를 여러대로 둔다. 그런 상황에서 각 서버들이 Session 동기화가 되어야 한다. 근데 그런 방법이 정말 복잡하다. 서버가 Session 을 읽어야하는데 트래픽이 많아지면 무리가 발생한다. 보통 쿠키랑 세션을 함께 쓰는데, CORS문제가 발생할 수도 있다. 이러한 문..
참고 : https://nahwasa.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-Spring-Security-%EA%B8%B0%EB%B3%B8-%EC%84%B8%ED%8C%85-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0 Spring Security는 프로젝트에 있어서 로그인한 유저를 관리해주는 프레임워크다. 여기에서 관리란 애플리케이션의 보안(인증과 권한, 인가 등)을 말한다. 현재 프로젝트에서 적용할 사항은 아래와 같다. 1. ID, Passwd를 이용한 로그인(인증) 2. 사용자에 대한 권한부여(접근 제어) 3. 세션 관리 4. 위 정보들에 대한 보관 및 관리 Spring..