분류 전체보기
-
[Spring Security] Spring Security의 로그인 과정 씹어먹기 - 인증웹/Spring 2024. 8. 9. 11:25
들어가며... 로그인, 로그아웃 기능은 굉장히 간단해 보이지만 그 기능을 구현하는 방식도 여러가지(단순한 세션 방식, JWT 방식, OAuth2 방식)이고, 회원들의 정보가 저장된 저장소도 제각각이며(In-memory, Redis, Database, ...), 심지어는 회원의 ID, PW를 보내는 HTTP 스키마 마저 자유분방하다(Form-data, Json-data, Http Basic, ...).하지만, 스프링 시큐리티는 이런 자유도 높은 로그인, 로그아웃 구현 방법을 굉장히 세세한 단계로 쪼개어 추상화 했고 그것에 걸맞는 인터페이스를 제공한다. 그 인터페이스들을 구현해 손쉽게 로그인, 로그아웃 기능을 구현할 수 있도록 도와준다. 그러나 워낙 로그인, 로그아웃 기능이 여러가지 방식으로 구현될 수 있..
-
[Spring MVC] @ExceptionHandler와 @ControlAdvice로 예외 처리하기웹/Spring 2024. 7. 31. 22:56
목표사용자 정의 예외 및 Java가 지원하는 예외가 발생했을 때, JSON 형식으로 응답을 반환하는 객체를 작성한다.컨트롤러 코드와 예외 처리 코드를 분리할 수 있도록 한다.JSON 형식의 반환과 더불어 HTTP 코드 응답도 할 수 있는 예외처리 객체를 작성한다. 스프링 예외 처리 과정스프링 MVC 프레임워크가 예외처리를 진행하는 과정은 다음과 같다.컨트롤러 내부에서 예외가 발생한다. - HttpServletResponse.sendError() 메서드 등으로 오류를 전달해도 동일하게 동작만약 컨트롤러 및 필터 등에 try-catch 문이 존재한다면 예외가 잡혀 catch 문 내의 코드가 실행된다.try-catch 문이 없다면 WAS 계층까지 예외가 전파되며, WAS 계층에서는 서버 내부에 문제가 있다고 ..
-
[Spring Security] 데이터베이스에 저장된 데이터를 기반으로 사용자 인증하기 (+ Spring Data JPA)웹/Spring Security 2024. 7. 19. 17:42
Previously on...지난 포스팅에서 무작정 Spring Security를 프로젝트에 도입했고, 인증 API와 비인증 API를 구별하는 작업까지 진행했다. 아직까지는 인증 주체가 존재하지 않아 구축한 인증 API에 인증 할 수 없다. 이번 포스팅에서는 인증 주체인 사용자(ID와 비밀번호)를 데이터베이스에 저장해두고 해당 데이터베이스 값을 활용해 인증하는 로직을 구현해보겠다. 객체, 인터페이스 정리Spring Security가 인증을 진행하는 전체적인 흐름을 살펴보겠다. Spring Security는 여러개의 필터로 이루어져있는데, 전체 필터 아키텍처를 이해하는 것보다는 실제 인증 과정에 사용되는 객체나 인터페이스를 하나씩 톺아보며 공부해보자! AuthenticationToken사용자의 정보와 인증..
-
[Spring Security] Spring Security 맛보기웹/Spring Security 2024. 7. 19. 17:08
보안의 필요성보안은 웹 애플리케이션을 구축할 때 정말 중요한 요소이다. 웹 애플리케이션이 어떤 기능을 제공하냐에 따라 비즈니스 로직을 작성하는 것 이상으로 중요할 수도 있다. 높은 수준의 보안을 유지하기 위해서는 애플리케이션 뿐 아니라 인프라 수준의 보안을 유지하는 것이 필수적이다. 그러나 각 계층에는 각각의 책임이 존재하기 때문에 애플리케이션은 애플리케이션 수준에서 최선의 보안을 제공해야 한다. 인프라의 보안도 마찬가지이다. 애플리케이션의 보안을 철두철미하게 보장한다는 것은 상당히 어려운 일이다. 애플리케이션에게 가할 수 있는 공격은 매우 많으며 시간이 지날수록 새로운 공격법도 창발하기 마련이다. 애플리케이션의 로직을 구현하는데 전념해야할 개발자가 이러한 곳에 신경을 쓴다는 것은 상당한 리소스 낭비이다..
-
Spring Boot 환경에서 컨테이너 테스트 환경 구축하기 w/ Testcontainers웹/Spring 2024. 7. 18. 15:10
테스트 환경 구축의 필요성Spring Boot로 개발하다 보면, 내가 작성한 컴포넌트가 올바르게 동작하는지 테스트 할 필요가 있고, 아예 테스트 기반으로 개발을 해나가는 TDD라는 개념도 존재한다.아직 테스트 코드를 작성하는데 미숙하지만, 테스트 코드가 주는 이점이 상당하다고 생각한다. 그 중 대표적인 것이 개발 생산성 증가인 것 같다. 테스트 코드를 작성하지 않으면 Postman과 같은 API 테스터기로 테스트를 진행해야 하는데, 이것이 여간 생산성을 좀먹는 존재가 아니다. 더군다나 자동화되지 않은 테스트 방식은 휴먼 에러를 불러일으키기도 매우 쉽다. 다만, API를 테스트 할 때 고려해야 할 것이 바로 외부 모듈(대표적으로 DB)이다. 외부 모듈이 항상 같은 반환값을 내주어야 테스트 결과도 일정해지기..
-
[Docker] 컨테이너란? 컨테이너는 왜 사용하는가?웹/Container 2024. 7. 16. 15:24
컨테이너란?컨테이너란, 애플리케이션 코드, 그 코드의 종속성(라이브러리, 패키지), 그리고 런타임을 담고 있는 가상환경이다. 컨테이너를 왜 사용하는가?컨테이너를 사용하지 않고 로컬 개발 환경을 구축한다고 생각해보자. 일반적으로 Node나 Python, Java와 같은 런타임을 설치해야하고, 그것을 활용하는 애플리케이션 코드가 MySQL이나 MongoDB 같은 데이터베이스에 트랜잭션 요청을 보내며 로직을 수행하기 때문에 그러한 데이터베이스도 개발 환경에 설치해야한다. 만약 이러한 프로젝트가 동일한 환경에 여럿 필요하다고 가정해보자. 어떤 프로젝트는 Node20을 사용해야 하고, 어떤 프로젝트는 Node14를 사용해야 하는 등 종속성 문제에 직면하게 된다. 더 나아가 Node20을 사용해 개발하다가 Node..
-
RESTful API에 대한 오해와 진실공부/네트워크 2024. 7. 16. 14:37
서론REST API를 어떻게 설계해야하는지 담은 영상을 요약해보았다. 영상을 보기 이전에는...영상을 보기 전까지는 REST API가 단순히 아래와 같은 제약조건을 지키면 되는 API인 줄 알았다.자원(Resource)모든 자원에는 고유한 ID가 존재하고, 이 자원은 서버에 존재한다.클라이언트는 URI를 이용해서 자원을 지정하고 해당 자원의 상태에 대한 조작을 서버에 요청한다.이때, 어떤 조작을 수행할지는 다음 "행위"에 따라 결정된다.행위HTTP Method 등을 활용해 어떤 행위를 할 것인지 명시한다. (GET, POST, PUT, ... )표현Client가 자원의 상태에 대한 조작을 요청하면, 서버는 이에 대한 적절한 응답을 보낸다. 대표적으로 JSON, XML 등의 여러 형태로 표현될 수 있다. ..
-
[후기] 2024년 하반기 ICT 인턴십 코딩테스트 후기회고록/후기 2024. 7. 12. 04:49
요약기업 코딩테스트에 비해선 쉬운 편영어로 제출되기 때문에 오히려 독해가 더 어렵다부정행위로 오인받지 않도록 주의하자 서론올 하반기엔 인턴 경험을 해보고자, 그리고 원하는 기업이 마침 ICT 인턴십에 등록되어 해당 기업에서 근무해보고자 ICT 인턴십을 지원하게 되었다. 지원한 회사에 따라서 코딩테스트를 볼 수도 안 볼 수도 있는데, 지원한 회사가 여러 군데라 하더라도 한 번의 시험만 보면 된다. 시험은 정해진 기간에 시작하여 6시간 내로 끝내면 되는 비교적 자유로운 형식이다. 해커 랭크라는 해외 사이트에서 진행하여 영어로 제출된다. 영어로 제출되기 때문에 독해가 어려울 수 있기 때문에 ICT 인턴십을 생각하고 있다면 해당 사이트에서 영어로 된 지문을 읽어보며 풀어보는 연습을 해보자. 각 문제 별 유형과 ..