spring 24

[JPA] 객체 지향 쿼리 언어 JPQL 2 (기본 문법)

JPQL 문법jpql 문법은 sql 문법과 동일하다.  엔티티와 속성은 대소문자를 구분한다. EX) select m from Member as m where m.age > 18 ) 여기서 member와 age의 대소문자가 틀리다면 쿼리가 실패한다.jpql 키워드는 대소문자를 구분하지 않는다. (select, from ,WHERE 등등 ,,)테이블의 이름이 아닌 엔티티의 이름을 사용한다.별칭 (m)은 필수이며, as는 생략 가능하다.집합과 정렬위의 함수들 및 Group By, HAVING, ORDERBY 모두 지원한다. TypeQuery, QueryTypeQuery: 반환 타입이 명확할 때 사용한다.TypedQuery query = em.createQuery ("select m from Member m",..

spring/JPA 2024.07.29

[Spring Security] Oauth 2.0 카카오 소셜 로그인 구현하기 1. (소셜 로그인 흐름 확인하기)

최근 프로젝트를 진행하며 백엔드에서 카카오 소셜 로그인 구현을 맡게 되었다. Spring security에서 제공하는 기능을 활용하여 카카오 소셜 로그인을 구현한 과정을 정리해보도록 하겠다. Oauth 2.0 란?우선 oauth 2.0란 단순한 프로토콜을 의미한다. 외부 리소스 서버에서 특정 유저의 정보를 가져오기 위한 표준 규격이다. Oauth 2.0에 대한 자세한 정보는 이전 글에 정리해 뒀으니 참고하길 바란다.https://2junbeom.tistory.com/24 스프링 시큐리티 기본 개념공부 10. (OAUTH2 란?)Section 11.OAUTH2oauth2는 많은 업계에서 사용중인 인증과 인가를 위한 프로토콜이다.OAUTH2가 해결한 문제 시나리오트위터 앱을 사용중인 유저들이 자신들의 트위터..

[JPA] 객체 지향 쿼리 언어 JPQL 1 (소개)

JPA는 다양한 쿼리 방법을 지원한다.1. JPQL2. JPA Criteria3. QueryDSL4. 네이티브 SQL JQPL은 jpa에서 제공하는 표준 문법을 의미한다.JPA Criteria와 QueryDSL은 java 코드로 JPQL을 생성하는 생성 클래스 라고 생각하면 된다. 네이티브 SQL은 특정 데이터베이스에 종속적인 쿼리가 나가야할 때 사용하는 것인데, postgreSQL 에서만 지원하는 문법을 사용하고자 할 때 네이티브 SQL을 사용하는 것이다. 더보기JPA를 사용하며 JDBC API나 MyBatis, SpringJdbcTemplate도 함께 사용이 가능하기에 jpql로 해결할 수 없는 문제라면 같이 사용하여 해결할 수도 있다.* 단 적절한 시점에 영속성 컨텍스트의 flush가 필요하다. (..

spring/JPA 2024.07.27

스프링 시큐리티 기본 개념공부 11. (Oauth2 실습)

Section 13.KeyCloak키클락이란 인증 서버를 제공해주는 서비스로 바로 사용할 수 있는 구축된 서버를 제공한다.키클락 외에도 Okta, ForgeRock, Amazon Congnito등에서 인증 서버를 제공해준다.키클락은 오픈소스로서 비용이 들지 않음에도 불구하고 안정적이며 주기적인 업데이트가 이뤄진다.외에도, 액세스 토큰 발급, SSO 기능(하나의 인증서버를 통해 다른 모든 어플리케이션에 접근 가능하도록 하는 기능) 제공, 소셜 로그인 기능, 중앙 제어 기능 등등을 제공한다.KeyCloak 설치 방법사이트에서 파일을 다운받은 뒤 터미널에서 bin/kc.bat start-dev로 실행하면 된다.이제 port번호 8080 으로 실행될 것이며 localhost 8080으로 접속하면 관리자 계정을 ..

스프링 시큐리티 기본 개념공부 10. (OAUTH2 란?)

Section 11.OAUTH2oauth2는 많은 업계에서 사용중인 인증과 인가를 위한 프로토콜이다.OAUTH2가 해결한 문제 시나리오트위터 앱을 사용중인 유저들이 자신들의 트위터 사용 기록을 분석하고 싶어한다.트위터 Analizer라는 웹 어플리케이션을 개발하려한다.트위터 Analizer는 트위치 내 유저의 모든 정보가 필요하다.트위터 Analizer는 트위치에 유저 정보를 요구하기위해 유저의 인증관련 정보가 필요하다.유저는 트위치 Analizer에 자신의 인증 정보를 모두 공유하고 트위치 Analizer는 그 정보를 통해 트위치에서 유저 관련 정보를 받아왔다.하지만 본인의 인증 정보를 제 3어플리케이션에 공유하는 것이기에, 만약 해당 웹이 불법 사이트였을 경우 자신의 정보가 악용될 가능성이 있었다.그..

스프링 시큐리티 기본 개념공부 9. (메소드 레벨 보안이란?)

Section 10. 메소드 레벨 보안Spring Security에서 메소드 레벨 보안은 기본적으로 비활성화 되어있다.메소드 레벨 보안의 활성화를 위해선 @EnableMethodSecurity라는 어노테이션을 사용해야한다.해당 어노테이션은 클래스 위에 선언하여 메소드레벨 보안을 활성화시킬 수 있다.해당 어노테이션 이외에도 다른 어노테이션들이 필요하다. 첫 번재 세트는 @preAuthorize, @postAuthorize이다.위의 어노테이션들을 사용하기 위해선 @EnableMethodSecurity 내부에서 (prePostEnabled =true)로 설정해야한다.@Secured를 사용하기 위해선 securedEnabled =ture, @RoleAllowed를 사용하기 위해선 jsr250Enabled = t..

스프링 시큐리티 기본 개념공부 8. (JWT 토큰의 개념과 사용 방법)

Section 9.JSESSIONID 에 관하여jsessionid는 로그인시 자동으로 생성되는 쿠키로, 해당 쿠키가 저장되면 다시 보안api 요청시 재 로그인이 필요없다.그러나 jsessionid는 작은 규모의 프로젝트에선 적합하지만 대규모의 프로젝트에서는 적합하지 않은데해당 토큰은 유저 데이터를 갖고 있지 않다. (무작위로 생성된 값이기 때문에 유저 데이터를 넣을 수 없다.)보안상 취약하여 브라우저에 저장된 해당 쿠키를 악용할 가능성이 높다.그렇기에 우리는 jsessionid 보다 더 나은 선택지를 찾아야한다.토큰이란 무엇인가?토큰이란 범용고유 식별자(UUID) 형식의 일반 문자열 또는 json web token 두 종류 중 하나이다.해당 토큰들은 엔드 유저의 인증 작업이 완료되는 로그인 작업 중 처음..

Spring Security 기본 개념 공부 7. (사용자 커스텀 필터 작성 방법)

Section 8.스프링 시큐리티 필터기본적으로 스프링 시큐리티엔 수많은 필터들이 정의 돼있다.그 필터들의 구조와 흐름을 알아야 적절한 위치에 적절한 로직을 지닌 커스텀 필터를 삽입할 수 있다.커스텀 필터 작성하는 방법커스텀 필터를 작성하기 위해서는 우선 Filter 인터페이스를 상속받아야한다.Filter 인터페이스를 상속받은 후 doFilter 메소드 내부에서 실행하고자하는 모든 로직을 정의하면 된다.doFilter 메소드의 인자로는 세가지가 있다.ServletRequest, 엔드유저로부터 오는 HTTP request이다.ServeletResponse, 엔드 유저에게 돌려보내는 HTTP response이다.filterChin, 필터들의 조합으로서 사용가능한 모든 필터로부터 다음 필터가 무엇인지 찾아내는..

Spring Security 기본 개념 공부 6. (권한 부여와 인증 방법)

Section 7.인증과 인가의 차이인증은 사용자가 api에 접근이 가능한 사용잔가 아닌가를 구별하는 것이다.인가란 권한부여로서 특정 api에 접근이 가능한 권한을 설정하여, 해당 권한이 있는 사람만 해당 api에 접근할 수 있도록 설정하는 것이다.항상 인증이 먼저 일어나고 그 이후에 인가가 발생한다.인증을 통해 로그인을 하고 어느 부분까지 접근할 수 있냐를 인가로 판단하는것이다.인증에서는 아이디, 비밀번호, OTP 등의 정보를 필요로한다.권한 부여에서는 자격증명관련 정보는 전혀 필요로 하지 않고, 역할이나 특권에 대한 정보만을 필요로한다.인증 실패는 401 에러코드가 뜨고, 권한이 없을 시엔 403 에러코드가 발생한다.유저의 권한과 역할이 저장되는 곳public interface GrantedAutho..

Spring Security 기본 개념공부 5. (Cors, Csrf란?)

Section 6. Cors란? Cross Origin Resource Sharing의 약자로 두 가지 이상의 다른 출처에서 자원을 공유한다는 의미이다. 두가지 이상의 다른 출처란 프론트와 백을 의미한다. 출처란 무엇일까?: http 프로토콜, 도메인주소(url), 포트번호의 조합을 출처라고 볼 수 있다. 셋중 하나라도 다르면 출처가 다르다로 할 수 있다. 이렇게 서로다른 출처에서 자원의 공유가 일어나면 최신 브라우저들은 모두 소통을 차단하도록 설정되어 있다. 그 이유는 이렇게 다른 출처에서 들어오는 요청을 차단함으로서 많은 보안적 이점을 가져갈 수 있기 때문이다. 그렇다면 우리는 웹을 개발할때 어떻게 해야할까? 첫 번째 방법은 @RestController 어노테이션 밑에 @CrossOrigin이라는 어..