spring/spring security 13

[Spring Security] Oauth 2.0 카카오 소셜 로그인 구현하기 2. (코드 구현)

의존성// Security implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' 다음과 같이 Oauth2-client 의존성을 주입해준다. 설정 파일security: oauth2: client: provider: kakao: authorization-uri: https://kauth.kakao.com/oauth/authorize token-uri: https://kauth.kakao.com/oauth/token user-i..

[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가 해결한 문제 시나리오트위터 앱을 사용중인 유저들이 자신들의 트위터..

스프링 시큐리티 기본 개념공부 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이라는 어..

Spring Security 기본개념 공부 4.

Section 3. UserDetailsService 커스텀 이제 jdbcUserDetailsManager가 아닌 우리만의 로직으로 UserDetails를 정의해보겠다.! 우선 LoadUserByUsername 메소드를 직접 작성해야한다. 그러기 위해 데이터베이스에서 유저 정보를 가져와 UserDetails 객체로 만들어 반환해주는 로직을 작성해줘야한다. public class EazyBankUserDetails implements UserDetailsService { 다음과 같이 UserDetailsService를 구현하여 만든다. @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundExceptio..