분류 전체보기(185)
-
스프링 시큐리티 3. 인가( JWT 기반 Token 인가 구현 )
[ 인증과 인가의 차이 ] 2편이었던 인증 글에서는 로그인을 한 뒤 서버 내에 저장된 정보가 일치하는 것을 확인하는 작업을 진행하였다. 이렇게 인증은 프로그램 자체에 접근 권한이 있는 사용자를 가려내는 과정이다. 반면 인가는 프로그램 자체에 접근 권한이 있는 사람이 인증을 받고, 내부 리소스에 접근을 할 때 그 내부 리소스에 접근할 수 있는 권한 또는 역할에 포함되는가를 살펴보는 과정이다. 그래서 인증은 인가보다 먼저 일어나며 주요 특징을 표로 정리해보면 아래와 같다. Authentication Authorization 시스템에 권한이 있는지 유저의 신원을 확인함 리소스 접근 시 유저에게 권한 또는 역할이 있는지 확인함 인증은 인가보다 우선적으로 일어남 인가는 인증 이후에 일어남 로그인 정보가 필요함 권..
2024.03.17 -
스프링 시큐리티 2. 인증(AuthenticationProvider 작동 방식과 커스텀 AuthenticationProvider 작성)
[ 스프링 시큐리티 기본 제공 인증 ] 스프링에서는 기본적으로 로그인 기능을 제공한다. 1에서 따로 계정을 만들 수 있는 로직을 만든 이유는 이 기본 설정을 바꿔 원하는 객체로 회원가입을 하고 로그인하는 서비스를 만들기 위함이다. 이를 달성하기 전에 스프링 시큐리티에서 기본 제공하는 로그인 기능을 확인해보고 무엇을 바꾸면 되는지를 알아보자. 기본 로그인을 확인하기 위해선 1편 프로젝트를 그대로 사용하고 SecurityCheckController라는 파일을 만들고 하단의 코드를 작성해주자. SecurityCheckController.java @RestController public class SecurityCheckController { @GetMapping("/security") public String..
2024.03.16 -
스프링 시큐리티 1. 암호화(PasswordEncoder를 통한 회원 가입 구현)
[ 암호화가 필요한 이유 ] 스프링 시큐리티를 통해 자체적으로 계정을 만든다면, 유저의 아이디와 비밀번호를 DB에 저장을 할 것이다. 많은 스프링 유튜브 강의에서 로그인을 할 때 비밀번호를 암호화해서 DB에 저장하는 걸 알려주지 않는다. 그래서 처음 로그인을 구현했을 때 이를 지키지 않았던 기억이 난다. 그래서 보안으로 반드시 기억해야 할 내용은 유저의 패스워드는 반드시 암호화를 해제할 수 없도록 단방향 암호화를 해서 저장해야 한다는 것이다. 그 이유는 DB 속의 내용은 안전하지 않다. SQL injection과 같은 방식으로 DB 속의 데이터가 갈취 당할 수 있으며 그 내용은 유저의 아이디와 비밀번호 테이블에서 가져올 내용일 수도 있다. 이 때 공격자에게 아이디와 비밀번호를 갈취당하더라도 서비스 상에선..
2024.03.16 -
CSRF와 CSRF 설정
[ CSRF ] CORS는 웹 브라우저에서 제공하는 하나의 보호기능이다. 하지만 CSRF는 실제로 서버에 가해지는 공격이다. CSRF 공격은 사용자의 의지와 무관한 공격자의 의도대로 서버에 특정 요청을 일반 사용자가 보내는 것이다. 처음 말을 들었을 때 무슨 말인지 정확하게 이해가 안됐었다. 일단 아래의 예시를 한 번 봐보자. 어느 날 메일로 XX 카드에서 이벤트 행사를 하니, 웹 사이트에 접속을 하라는 요청을 받았다. 이 때 이메일을 받은 사용자는 웹 사이트에 접속을 했고 이벤트 페이지가 있었지만 흥미가 없는 이벤트라 페이지를 닫았다. 그런데 갑자기 카드 회사에서 100만원이 빠져나가버렸다는 문자가 왔다. 무슨 일일까? 이렇게 CSRF 공격은 공격자가 실제 사용자가 접속하고자 하는 사이트와 매우 유사한..
2024.03.13 -
CORS와 CORS 설정
[ CORS ] 서버 사이드 템플릿으로 작성하면 CORS 에러를 겪지 못한다. 하지만 다른 도메인, 같은 도메인이라도 다른 포트 번호를 가진 애플리케이션끼리 통신을 하면 CORS 에러를 겪을 수 있다. 그 이유는 Chrome이나 Safari 같은 브라우저가 다른 origin을 가지는 경우 CORS 기능으로 보호를 하려고 하기 때문이다. 여기서 언급하는 다른 origin은 HTTP, HTTPS 같은 scheme이 다른 경우, 도메인 명이 다른 경우, 포트 번호가 다른 경우 모두 해당된다. 그 이유는 출처가 불분명한 애플리케이션끼리의 통신은 보안성 위험을 가지기 때문이다. 그래서 웹 브라우저가 애플리케이션을 도와 외부 공격자가 직접 서버측에 요청을 보내는 것을 차단하게 하여 보안적 기능을 제공하는 것이다. ..
2024.03.13 -
JpaRepository와 CrudRepository - Spring 3.X
한국쪽 강의나 프로젝트를 보면 대부분 JpaRepository로 JPA를 사용하는데 해외 강의를 보면 CrudRepository를 상속 받아서 사용하는 편인 것 같다. 둘의 구분이 뭔지 궁금해졌고 스프링 3.X버전을 기준으로 이를 설명해보려고 한다. [ JpaRepository와 CrudRepository의 관계 ] JpaRepository는 결론부터 JPA를 사용하기 위해서 정의된 것으로 내부에 ListCrudRepository, ListPagingAndSortingRepository, QueryByExampleExecutor를 상속 받아서 만들어졌다. 이 중 ListCrudRepository는 CrudRespotiroy를 포함한다. 그래서 종합적인 기능은 JpaRepository에 들어있다. UML을..
2024.03.12