목록분류 전체보기 (78)
몰?.루();
구글에 'GET POST 보안'이라고 검색하면 많은 블로그에서 POST가 보안이 뛰어나다고 설명하고 있다.하지만 절대 POST가 보안이 뛰어나지 않다. 애초에 GET과 POST는 보안의 개념과는 거리가 멀다.그저 데이터를 전송할 때 어떻게 하느냐의 차이일 뿐이다. GET는 queryString에 모든 파라미터를 담아 전송하지만, POST는 body에 모든 파라미터를 담아 전송한다. 그리고 body의 정보는 크롬 개발자 도구 - Network 탭에만 들어가도 다 보인다. 위는 쿠팡에서 로그인 버튼을 눌렀을 때 전송된 패킷이다.body 부분에 password라고 당당히 찍혀서 전송되는 걸 볼 수 있다. 즉, 중간자가 그냥 해당 패킷을 감청하면 떡하니 비밀번호가 나오는 거다. 그럼에도 불구하고 쿠팡이 당당하게..
출처: https://mulmandu17.tistory.com/53 WSL1과 WSL2의 차이 WSL1: 리눅스 시스템 콜을 받으면 그걸 윈도우즈 시스템 콜로 번역 WSL2: CPU 위에 HyperVisior가 있는데 그 위에 윈도우즈 커널, 리눅스 커널이 따로 띄워져 있고 그 위에 각자 윈도우와 리눅스가 떠있음 WSL1과 WSL2의 단점 WSL1: 리눅스 파일 시스템에 접근하는 게 느림, 리눅스 시스템 콜 중에서 윈도우에 없는 것들은 사용 불가능 WSL2: 윈도우 파일 시스템에 접근하는 게 느림 WSL2는 윈도우쪽과 리눅스쪽이 아예 분리되어있는데 어떻게 서로 파일 시스템이 보이는가? P9 프로토콜을 이용해서 파일 시스템 서버를 열어서 마운트 시킴
script를 지원하지 않는 브라우저에서는 noscript 태그에 들어가있는 내용이 보이게 됩니다. 그런데 상식적으로 이상합니다. 과연 스크립트를 지원하지 않는 브라우저가 존재하긴 할까요? 처음 생각은 JS라는 게 세상에 존재하기도 전의 아주아주 오래된 브라우저라면 script를 지원하지 않을 것 같다는 생각이었는데, 그러면 script가 세상에 존재하지도 않았는데 그 브라우저가 noscript 태그는 지원하는 게 아주 이상합니다. 세상에 태어나지도 않은 존재를 예측해서 미리 noscript라는 태그를 지원할 순 없습니다. 결국 noscript도 사실상 현대에 쓰이는 브라우저들만 지원하는 태그라고 봐야합니다. 그런데 현대 브라우저는 전부 스크립트를 지원합니다. 왜 필요할까요? 이유는 사용자가 보안상의 목..
루트 DNS 서버는 전 세계에 몇 대 있을까? 개발자 면접 단골 질문 중에 '브라우저 주소창에 www.google.com을 검색하면 일어나는 일을 말씀해주세요'가 있습니다. 제가 입사할 때도 들었던 질문이었습니다. 평범한 면접과 압박 면접 사이...의 분위기였기에 긴장했어서 잘 기억은 안 나지만, 윈도우 host 파일/ISP DNS/루트 DNS/캐시 등의 단어를 이용해서 설명을 했었습니다. 그 답변에 대한 꼬리 질문 중에 하나가 '그럼 루트 DNS는 딱 1개 존재하는 것인가?' 였습니다. 루트 DNS에 대한 DDos 테러 사건에 대한 기사를 봤던 기억을 떠올리며, '전세계에 13대 존재한다'고 말했었습니다. 그러다가 최근 우연한 계기로 해당 내용과 관련된 자료를 찾아보다가 그 당시 답변이 틀렸다는 사실을..
파이어베이스를 사용하다보면 클라우드 메세징Cloud Messaing 기능을 사용하는 경우가 있습니다. 이를 통해서 앱에 푸쉬 알림을 간편하게 보낼 수 있습니다. 다만 한국에서는 광고성 푸쉬 알림을 보낼 때 주의해야할 사항들이 몇 가지 있습니다. 자세한 건 이 포스팅에서 다루지 않겠지만, 대충 개발자가 유의해야할 사항은 다음과 같습니다. 광고성 푸쉬 알림을 보내기 위해서는 사용자에게 별도로 승인 요청을 받아야하며, 광고를 허용 받았든 거부 받았든 통지해야한다. 2년마다 광고성 푸쉬 알림을 계속해서 받을지 말지 확인 받아야한다. (2년마다 확인 여부 화면을 띄워주기만 하면 되고, 사용자가 딱히 의사 표현을 하지 않았다면 그냥 계속 광고 허용한 걸로 간주해도 됨) 하지만 문제는 클라우드 메시징으로 보낸 푸쉬 ..
학부생 때나 하던 건데 오랜만에 갑자기 퀵 소트 구현이나 해볼까해서 위키피디아에 있는 퀵 소트 수도 코드를 보면서 코틀린으로 그대로 옮겨봤습니다 fun main() { val array = intArrayOf(3,7,8,5,2,1,9,5,4) array.quickSort() println(array.contentToString()) // [1, 2, 3, 4, 5, 5, 7, 8, 9] } fun IntArray.quickSort(start: Int = 0, end: Int = this.size - 1) { if (start >= 0 && end >= 0 && start < end) { val pivotIndex = this.partition(start, end) this.quickSort(start, ..
lateinit var a: String // 가능 lateinit var b: Int // 불가능 lateinit var c: Integer // 가능 왜냐하면 코틀린 코드를 자바로 변환했을 때 lateinit을 구현하는 방법 자체가 변수를 일단 null로 해놓고, getter를 호출하는 시점에 변수가 아직 null이면 Exception을 throw하는 방식이기 때문입니다. 그렇기 때문에 String 같은 non-primitive type들은 처음에 null을 일단 선언해놓을 수 있는데 int 같은 primitive type들은 처음에 null로 선언할 수가 없기 때문에 (자바에서 int형에 null을 넣을 수 없습니다. 멤버 변수 선언할 때 그냥 int a; 이렇게 선언만 해놓는 것도 결국엔 int ..
Android Jetpack에 포함되어있는 유명한 라이브러리 중 하나가 LiveData입니다. 값의 변화를 liveData.observe(this, Observer { // ... }) 이런 식으로 관찰해서 사용할 수 있기 때문에 많이 사용됩니다. 그리고 이 LivaData가 디자인 패턴 중에 옵저버 패턴을 사용하는 대표적인 예시 중 하나이기 때문에 옵저버 패턴을 공부할 겸 평소에 유용하게 쓰던 LiveData를 직접 구현해보겠습니다. class SimpleLiveData { private var data: T? = null private val observers = mutableListOf Unit>() fun observe(observer: (T?) -> Unit) { observers.add(obs..
인터넷에 검색해보면 다들 참 어려운 방법을 쓰고 앉아있는데 사실 요즘은 참 쉬운 방법이 있습니다. xml에서 버튼 속성에 app:cornerRadius="{숫자}dp"만 주면 됩니다. 참고로 Button에만 적용되고 TextView나 다른 것들엔 적용 안 되기 때문에 어려운 방법으로 구현해야하는 게 맞습니다. 버튼만 쉽게 가능.
제가 원한 것은 SubActivity를 띄웠을 때 바로 스크롤뷰가 특정 scrollY만큼 이동한 상태에서 화면이 보여지는 것이었습니다. 원했던 그림 실패한 코드 1 - onCreate나 onResume에 setScrollY 넣어보기 package com.example.test import android.os.Bundle import android.widget.ScrollView import androidx.appcompat.app.AppCompatActivity class SubActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCont..