Spring 40

[스프링] 의존성 주입

1. 개념 어떤 서비스를 개발한다고 생각해보자. 특정 서비스에는 다양한 기능들이 있고, 다양한 기능을 개발하기 위해서는 다양한 클래스가 필요하다. 기능 별로(로그인, 회원가입, 글 작성 등) 클래스가 분류될 것이고, 그 기능 안에서 service, controller, repository, entity 등 세부 기능으로 또 클래스가 분류된다. 이렇듯 우리는 스프링으로 서비스를 개발할 때 아주아주 다양한 클래스를 접하게 된다. 나는 앞으로 class 하나 하나를 컴포넌트라고 이야기 하려고 한다. 예를 들어 회원가입 기능을 생각해보자. 이를 위해서는 controller, service, repository, passwordEncoder 등의 컴포넌트가 필요하다. controller는 service컴포넌트가 ..

Spring/spring 2023.04.07

[시큐리티] OAuth2 - 승인 코드 그랜트 유형 깃허브로 연습

전제 조건 권한 부여 서버와 리소스 서버로 깃허브를 사용한다 클라이언트는 내가 작성한 스프링 백엔드 코드다 사용자는 깃허브를 사용하면서 내가 작성한 스프링 백엔드 코드에 접근한 사람이다 1. 권한 부여 서버에게 클라이언트를 알리기 깃허브에서 클라이언트의 이름, 홈페이지, 깃허브가 클라이언트를 다시 호출할 링크를 지정하기 양식 입력 후 클라이언트 ID와 클라이언트 비밀을 얻을 수 있다 2. 클라이언트에 인증 방식으로 OAuth2를 사용할 것이라고 선언하기 build.gradle 혹은 pom.xml에 OAuth2 의존성을 주입해야 한다 dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' } conf..

Spring/security 2023.03.31

[시큐리티] OAuth 2

1. 개념 권한 부여 프레임워크. 내가 만든 서비스에서 구글이나 네이버 같은 다른 플랫폼의 사용자 정보에 접근하기 위한 권한을 위임 받을 수 있도록 해주는 것. 2. 구성 요소 1) 리소스 서버 내가 만든 서비스에서 다른 플랫폼의 사용자 정보에 접근하려고 할 때, 다른 플랫폼의 사용자 정보를 리소스라고 한다. 그리고 이러한 리소스를 제공해주는 서버가 리소스 서버이다. 즉, 구글이나 네이버 같은 플랫폼의 서버가 리소스 서버라고 할 수 있다. 2) 사용자(리소스 소유자) 내가 만든 서비스를 사용하는 사용자이면서, 구글이나 네이버 같은 다른 플랫폼을 사용하여 그 플랫폼의 리소스를 소유하고 있는 사람 3) 클라이언트 사용자를 대신해 리소스 서버에 접근하는 주체로, 보통 내가 만든 서비스를 의미한다. 4) 권한 ..

Spring/security 2023.03.30

[시큐리티] 토큰

1. 개념 클라이언트가 애플리케이션의 자원에 접근할 수 있도록 해 주는 일종의 출입카드. 이것이 있어야 원하는 자원(엔드포인트)에 접근해서 자원을 얻을 수 있다. 서버가 클라이언트의 인증을 확인하는 방법 중 하나. 2. 작동 클라이언트가 본인의 아이디와 비밀번호를 서버에게 보내면서 나는 올바른 회원이니 토큰(출입카드)를 달라고 요청한다. 서버는 이 요청을 보고 저 회원이 올바른 회원인지 확인한 후, 올바른 회원이면 토큰을 주고 올바르지 않은 회원이면 토큰을 주지 않는다. 이때, 토큰을 준다면 건네준 토큰을 서버는 어딘가에 저장해 놓는다. 나중에 클라이언트가 토큰을 보냈을 때 올바른 토큰인지 검사가 필요하기 때문에. 클라이언트는 아까 받은 토큰을 가지고 있다가, 엔드포인트를 호출할 때(api를 호출해서 자..

Spring/security 2023.03.29

[시큐리티] CORS

1. 개념 CORS는 cross origin resource sharing의 줄임말이다. 여기서 origin은 프로토콜(http), 도메인(naver.com), 포트번호(8080)을 합친 것을 의미한다. 즉 CORS는 서로 다른 여러 origin끼리 자원을 공유할 수 있도록 해주는 정책이다. 이는 원래대로라면 SOP에 의해 막히게 될 요청을 풀어주는 것이다. SOP란 same origin policy의 줄임말로, 다른 origin으로 요청을 보내는 것을 금지하는 정책이다. 요즘 다른 origin으로 요청을 보내야 할 필요성이 커지자 CORS가 나타나게 된 것. 예를 들어, 백엔드에서 글을 작성할 수 있는 /post/write api를 만들었다고 하자. 만약 CORS가 적용되어 있지 않는다면, SOP에 의..

Spring/security 2023.03.28

[시큐리티] CSRF

1. 개념 사용자 A, A가 사용하는 서비스 B, 공격자 C가 있다고 하자. A는 B에 로그인을 한다. 로그인 된 상태로 A는 C가 보낸 이상한 링크를 통해 어떤 사이트에 접속한다. 이 사이트에는 B에 광고성으로 글을 올릴 수 있는 위조된 코드가 들어있다. A가 B에 로그인을 한 상태로 위조된 코드가 있는 사이트에 들어갔는데 만약 B가 요청이면 무조건 승낙을 하는 보안 정책을 가지고 있다면 B에는 위조된 요청에 의해 A의 계정으로 광고성 글이 작성된다. 이처럼 위조된 요청으로 서버에 어떤 작업을 시킬 수 있는 것이 CSRF이다. 2. 보호 방법 1) csrf 토큰 get요청이 들어왔을 때 서버가 고유한 csrf 토큰을 생성해서 클라이언트에게 보내고, 클라이언트는 이후 post, put, delete 등의..

Spring/security 2023.03.27

[시큐리티] 필터

1. 개념 요청을 수신하고 요청에서 요구하는 논리를 실행하며 실행을 모두 마치고 난 이후에는 체인의 다음 필터로 요청을 넘긴다. 예를 들어 숟가락을 쥔다, 숟가락으로 밥을 푼다, 푼 받을 입에 가져다가 넣는다, 씹는다 이런 과정이 있을 때 숟가락을 쥐는 것 부터 씹는 것까지의 전체 과정을 체인이라고 본다. 그리고 각 행위를 필터라고 본다. 2. 특징 스프링 시큐리티는 기본 필터도 제공하고, 맞춤형으로 필터를 새로 정의하는 것도 가능하게 함. 그리고 새롭게 정의한 필터를 체인에 추가할 수 있음 필터는 책임을 관리자에게 위임함 스프링 시큐리티 아키텍처의 필터는 일반적인 HTTP 필터 여러 필터가 같은 순서값을 가질 수 있는데, 스프링 시큐리티는 같은 순서값일 경우 어떤 걸 먼저 호출할 지 딱히 정해놓지 않는..

Spring/security 2023.03.23

[시큐리티] 권한과 역할제어

1. 권한 부여 1) 개념 식별된 클라이언트가 요청된 리소스에 엑세스할 권한이 있는지 시스템이 결정하는 프로세스 2) 특징 인증 흐름을 완료한 후 요청을 권한 부여 필터에 위임하고, 필터는 구성된 권한 부여 규칙에 따라 요청을 허용하거나 거부함. 즉, 항상 인증 이후에 수행됨 인증 프로세스 도중 UserDetailsService는 사용자의 권한을 포함한 모든 세부 정보를 얻음. 애플리케이션은 사용자를 성공적으로 인증한 후 GrantedAuthority 인터페이스로 나타내는 권한으로 권한 부여를 수행함 3) 과정 2. GrantedAuthority 1) 개념 사용자가 수행할 수 있는 작업을 GrantedAuthority 인터페이스로 나타냄 2) 특징 UserDetails는 GrantedAuthority 인..

Spring/security 2023.03.21

[시큐리티] SecurityContext

1. SecurityContext 개념 인증 프로세스를 성공적으로 완료한 후 요청이 유지되는 동안 AuthenticationManager는 Authentication 인스턴스를 저장한다. Authentication 객체를 저장하는 인스턴스를 보안 컨텍스트라고 한다. 여기서 Authentication은 인증된 엔티티에 대한 세부 정보(사용자의 이름이나 권한) public interface SecurityContext extends Serializable { Authentication getAuthentication(); void setAuthentication(Authentication authentication); } 2. SecurityContext를 관리하는 전략 1) MODE_THREADLOCAL ..

Spring/security 2023.03.16

[시큐리티] AuthenticationProvider

1. Authentication 1) 개념 인증 요청 그 자체를 나타내며, 애플리케이션에 접근을 요청한 엔티티의 세부 정보를 담음 2) 특징 Authentication에는 암호 같은 요구 사항이나 인증 요청에 대한 세부 정보를 더 추가할 수 있음 Authentication 계약은 Principal 계약을 상속한다 Principal은 애플리케이션에 접근을 요청하는 사용자를 의미하며, 인증하려는 사용자의 이름 정보 등을 가지고 있다. Authentication 계약은 애플리케이션에 접근을 요청한 주체에 대한 정보만 나타내는 것이 아니라 인증 프로세스 완료 여부, 요청한 주체의 권한 컬렉션 정보도 가지고 있다 3) 인터페이스 코드 isAuthenticated() 인증 프로세스가 끝났으면 true를 반환하고, ..

Spring/security 2023.03.15